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

}




相关文章
|
27天前
|
Java 开发者 Spring
【SpringBoot 异步魔法】@Async 注解:揭秘 SpringBoot 中异步方法的终极奥秘!
【8月更文挑战第25天】异步编程对于提升软件应用的性能至关重要,尤其是在高并发环境下。Spring Boot 通过 `@Async` 注解简化了异步方法的实现。本文详细介绍了 `@Async` 的基本用法及配置步骤,并提供了示例代码展示如何在 Spring Boot 项目中创建与管理异步任务,包括自定义线程池、使用 `CompletableFuture` 处理结果及异常情况,帮助开发者更好地理解和运用这一关键特性。
105 1
|
1月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
23天前
|
缓存 Java 数据库连接
Spring Boot奇迹时刻:@PostConstruct注解如何成为应用初始化的关键先生?
【8月更文挑战第29天】作为一名Java开发工程师,我一直对Spring Boot的便捷性和灵活性着迷。本文将深入探讨@PostConstruct注解在Spring Boot中的应用场景,展示其在资源加载、数据初始化及第三方库初始化等方面的作用。
44 0
|
8天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
1月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
1月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
23天前
|
监控 安全 Java
【开发者必备】Spring Boot中自定义注解与处理器的神奇魔力:一键解锁代码新高度!
【8月更文挑战第29天】本文介绍如何在Spring Boot中利用自定义注解与处理器增强应用功能。通过定义如`@CustomProcessor`注解并结合`BeanPostProcessor`实现特定逻辑处理,如业务逻辑封装、配置管理及元数据分析等,从而提升代码整洁度与可维护性。文章详细展示了从注解定义、处理器编写到实际应用的具体步骤,并提供了实战案例,帮助开发者更好地理解和运用这一强大特性,以实现代码的高效组织与优化。
35 0
|
30天前
|
存储 Java API
|
1月前
|
安全 搜索推荐 Java
|
1月前
|
设计模式 Java 测试技术
公司为何禁止在SpringBoot中使用@Autowired注解?
【8月更文挑战第15天】在Spring Boot的广泛应用中,@Autowired注解作为依赖注入的核心机制之一,极大地简化了Bean之间的装配过程。然而,在某些企业环境下,我们可能会遇到公司政策明确禁止或限制使用@Autowired注解的情况。这一决策背后,往往蕴含着对代码质量、可维护性、测试便利性以及团队开发效率等多方面的考量。以下将从几个方面深入探讨这一决定的合理性及替代方案。
30 0