Springboot怎么用Aop捕捉注解实现业务异步执行


这篇“Springboot怎么用Aop捕捉注解实现业务异步执行”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Springboot怎么用Aop捕捉注解实现业务异步执行”文章吧。

一、先说说线程的几种创建方式(简要列举)

1、继承Thread类,复写run方法:

publicclassExtendsThreadextendsThread{@Overridepublicvoidrun(){try{System.out.println(Thread.currentThread().getName()+"执行");}catch(Exceptione){}}publicstaticvoidmain(String[]args){newThread(newExtendsThread()).start();}}

2、实现Runnable接口,重写run方法:

publicclassImplementsRunnableimplementsRunnable{@Overridepublicvoidrun(){try{System.out.println(Thread.currentThread().getName()+"执行");}catch(Exceptione){}}publicstaticvoidmain(String[]args){newThread(newImplementsRunnable()).start();//这里还可以使用匿名内部类的写法创建一个线程newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"执行");}},"匿名内部类实现Runnable接口的线程");}}

3、实现Callable接口,使用FutureTask创建线程(可以获得返回值):

publicclassCallableAndFutureimplementsCallable<String>{@OverridepublicStringcall()throwsException{Thread.sleep(3000);System.out.println(Thread.currentThread().getName()+"执行");return"success";}publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{FutureTask<String>futureTask=newFutureTask<>(newCallableAndFuture());//futureTask.run();主线程执行call方法newThread(futureTask).start();Stringresult=futureTask.get();System.out.println(result);}}

4、使用线程池创建线程(这里利用提供的线程池框架Executors创建线程池):

publicclassExecutor{publicstaticvoidmain(String[]args){ExecutorServiceexecutorService=Executors.newCachedThreadPool();executorService.execute(newRunnable(){@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"执行");}});}}

二、再聊一聊spring自带的@Async注解实现异步任务的方法

其实很简单,就是在应用程序启动类上打@EnableAsync注解开启异步注解的使用,再在业务类的某个方法上打@Async即可。

@SpringBootApplication@EnableAsyncpublicclassAopApplication{publicstaticvoidmain(String[]args){SpringApplication.run(AopApplication.class,args);}}

业务类方法(举例):

@AsyncpublicvoidinsertDb(){/*servicecode......*/System.out.println("2----->收到请求,写入数据库");}

三、那么就来设计一下怎么使用自定义的注解实现异步任务

首先我们写一个注解:

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public@interfaceMyAsync{//规定value是异步开关booleanvalue()defaultfalse;}

我们让注解中的value的值定为布尔类型,从而根据它的真假来决定异步线程的创建。

我们将它打在业务类的方法上:

@MyAsync(value=true)publicvoiddeleteDb(){/*servicecode......*/System.out.println("delete------>数据删除");}

然后我们利用AOP扫描这个注解:

AspectponentpublicclassAopUtils{@Around(value="@annotation.example.aop.Aop异步.MyAsync)")publicvoidlistenMyAsync(ProceedingJoinPointjoinPoint)throwsThrowable{MethodSignaturesignature=(MethodSignature)joinPoint.getSignature();Methodmethod=signature.getMethod();MyAsyncannotation=method.getAnnotation(MyAsync.class);booleanvalue=annotation.value();if(value)newThread(newRunnable(){@SneakyThrows@Overridepublicvoidrun(){joinPoint.proceed();}}).start();elsejoinPoint.proceed();}}

我们可以看到利用Around寻找执行的线程中某个含有注解的方法栈,捕捉到之后就可以获得对应的连接点对象了。

利用可通过连接点对象ProcedJoinPoint的getSignture方法获取签名,可以将签名强制转化成方法签名MethdSignture类型,从而利用该类型的getMethod方法获取方法本身,接下来就可以获取方法的注解,利用注解的属性直接获取value的真假,从而决定方法通过的方式是同步的还是异步的。(源码利用到反射机制)。

以上就是关于“Springboot怎么用Aop捕捉注解实现业务异步执行”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注主机评测网行业资讯频道。


上一篇:Zookeeper中怎么解决zookeeper.out文件输出位置问题

下一篇:Python文件路径处理模块pathlib怎么使用


Copyright © 2002-2019 测速网 www.inhv.cn 皖ICP备2023010105号
测速城市 测速地区 测速街道 网速测试城市 网速测试地区 网速测试街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!

热门搜索 城市网站建设 地区网站制作 街道网页设计 大写数字 热点城市 热点地区 热点街道 热点时间 房贷计算器