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

}




相关文章
|
16天前
|
Java Spring 容器
如何解决spring EL注解@Value获取值为null的问题
本文探讨了在使用Spring框架时,如何避免`@Value(&quot;${xxx.xxx}&quot;)`注解导致值为null的问题。通过具体示例分析了几种常见错误场景,包括类未交给Spring管理、字段被`static`或`final`修饰以及通过`new`而非依赖注入创建对象等,提出了相应的解决方案,并强调了理解框架原理的重要性。
56 4
|
2月前
|
缓存 Java 数据库连接
Spring Boot奇迹时刻:@PostConstruct注解如何成为应用初始化的关键先生?
【8月更文挑战第29天】作为一名Java开发工程师,我一直对Spring Boot的便捷性和灵活性着迷。本文将深入探讨@PostConstruct注解在Spring Boot中的应用场景,展示其在资源加载、数据初始化及第三方库初始化等方面的作用。
73 0
|
13天前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
53 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
5天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
10天前
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解
|
11天前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
11天前
|
Java API Spring
springBoot:注解&封装类&异常类&登录实现类 (八)
本文介绍了Spring Boot项目中的一些关键代码片段,包括使用`@PathVariable`绑定路径参数、创建封装类Result和异常处理类GlobalException、定义常量接口Constants、自定义异常ServiceException以及实现用户登录功能。通过这些代码,展示了如何构建RESTful API,处理请求参数,统一返回结果格式,以及全局异常处理等核心功能。
|
17天前
|
Java Spring 容器
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
这篇文章讨论了在Spring Boot 3.2.1版本中,同名同类型的bean和@Service注解类之间冲突的问题得到了解决,之前版本中同名bean会相互覆盖,但不会在启动时报错,而在配置文件中设置`spring.main.allow-bean-definition-overriding=true`可以解决这个问题。
51 0
Springboot3.2.1搞定了类Service和bean注解同名同类型问题修复
|
22天前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
42 2
|
1月前
|
Java Spring 容器
Spring使用异步注解@Async正确姿势
Spring使用异步注解@Async正确姿势,异步任务,spring boot