自定义spring注解使用

简介: 自定义spring注解使用+ThreadLocal使用

多线程创建方式

1.继承Thread类

2.实现Runnalbe接口

3.使用匿名内部类

4.使用lambda表达式创建

5.使用callable和Future

6.使用线程池(juc-ThreadPoolExecutor,spring-ThreadPoolTaskExecutor)

7.spring @Async异步注解,结合线程池

线程状态:初始化-就绪-运行-死亡-阻塞-超时-等待

image.png

@Async的使用

1.aop拦截只要在方法上有使用到@ZzrAsync注解的,就单独的开启单独的异步线程去实现。

Aop:

http请求

环绕通知开始

目标方法

环绕通知结束

image.png

代码如下:

目录:

image.png


注解类:
/**
* @author Admin
*/
@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface ZzrAsync {


   String value() default "";
}


线程类:

@Component

@Slf4j

public class TestThread {


   @ZzrAsync

   public void asyncLog(){

       try {

           log.info("目标方法正在执行,等待5s");
           Thread.sleep(5000);
           Map<String, String> stringStringMap = ExThreadAsyncAop.THREAD_LOCAL_NUM.get();
           System.out.println(stringStringMap);
           log.info("目标方法执行完毕,等待5s结束");
       } catch (InterruptedException e) {

           e.printStackTrace();
       }

   }

}


controller使用:

/**
* @author zzr
* @version 1.0
* @since 2020/7/20 16:39
*/
@RestController

@RequestMapping(value = "thread")

public class TestMain {


   @Resource

   TestThread testThread;

   @RequestMapping(value = "hello")

   public String hello3() {

       testThread.asyncLog();
       return "hello, " + 1;
   }

}


AOP操作注解:

@Aspect

@Component

@Slf4j

public class ExThreadAsyncAop {

   /**
    * 线程本地存储变量
    */
   public static final ThreadLocal<Map<String,String>> THREAD_LOCAL_NUM = new ThreadLocal<>();
   /**
    * 环绕通知,会拦截方法
    * @param joinPoint
    * @return
    */
   @Around(value = "@annotation(com.example.bilibili.ZzrAsync)")

   public Object around(ProceedingJoinPoint joinPoint) {

       log.info("环绕通知开始执行");
       // 在调用目标方法的时候使用线程即可将加了注解的方法多线程执行,如下
       new Thread(() -> {

           try {

               Map<String, String> map = new HashMap<>();
               map.put(Thread.currentThread().getName(),"testvalue"+Thread.currentThread().getName());
               THREAD_LOCAL_NUM.set(map);
               joinPoint.proceed();
           } catch (Throwable throwable) {

               throwable.printStackTrace();
           } finally {

               THREAD_LOCAL_NUM.remove();
           }

       }).start();
//          joinPoint.proceed();// 会调用aop的目标方法--即使用ZzrAsync注解的方法
       log.info("环绕通知结束执行");
       return "环绕通知";
   }

}




相关文章
|
29天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
170 73
|
24天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
51 21
|
1月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
1月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
29天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
29天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
1月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
112 14
|
2月前
|
前端开发 Java Spring
Spring MVC核心:深入理解@RequestMapping注解
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的核心,它将HTTP请求映射到控制器的处理方法上。本文将深入探讨`@RequestMapping`注解的各个方面,包括其注解的使用方法、如何与Spring MVC的其他组件协同工作,以及在实际开发中的应用案例。
56 4
|
2月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
194 2
|
2月前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
72 2