自定义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 "环绕通知";
   }

}




相关文章
|
7天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
25 0
|
1月前
|
Java Spring 容器
如何解决spring EL注解@Value获取值为null的问题
本文探讨了在使用Spring框架时,如何避免`@Value(&quot;${xxx.xxx}&quot;)`注解导致值为null的问题。通过具体示例分析了几种常见错误场景,包括类未交给Spring管理、字段被`static`或`final`修饰以及通过`new`而非依赖注入创建对象等,提出了相应的解决方案,并强调了理解框架原理的重要性。
124 4
|
26天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
14天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
40 4
SpringBoot必须掌握的常用注解!
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
66 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
16天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
57 2
|
16天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
1月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
11天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
10 0
|
1月前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解