1.在pom.xml中加入如下依赖
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-aop</artifactid> </dependency>
2.在spring boot的application启动类上加上
@enableasync(proxytargetclass = true)
proxytargetclass为可选配置相,默认为false
3.创建异步执行类myasynctask
@component public class myasynctask { private logger logger = loggerfactory.getlogger(getclass()); @async public void refreshmydbasync(string url, string id) { for(int i=0; i < 10; i++){ logger.info("2.in async method id:" + id + " count:" + i + " url:" + url); try { thread.sleep(5000); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } }
4.创建aspect类,定义切入点并在切入点执行后调用异类执行类的异步方法
@aspect @component public class myaspect { private logger logger = loggerfactory.getlogger(getclass()); @autowired private myasynctask myasynctask; @pointcut("execution(* com.lantian.controller.controller1.detail(..)) || " + "execution(* com.lantian.controller.controller1.list(..)) || " + "execution(* com.lantian.controller.controller2.detail(..))") public void modifymethod() {} @afterreturning(returning = "ret", pointcut = "modifymethod()") public void aftermodify(object ret) { //获取request httpservletrequest request = ((servletrequestattributes) requestcontextholder.getrequestattributes()).getrequest(); string url = request.getrequesturl().tostring(); string id = request.getparameter("id"); logger.info("1.before async method url:"+url); logger.info(ret+""); myasynctask.refreshmydbasync(url, id); logger.info("3.after async method url:"+url); } }
5.注意事项:
异步方法不能直接写在aspect类里,否则不会异步执行。
spring对@transactional注解时也有类似问题,spring扫描时具有@transactional注解方法的类时,是生成一个代理类,由代理类去开启关闭事务,而在同一个类中,方法调用是在类体内执行的,spring无法截获这个方法调用。
到此这篇关于spring boot使用aop在指定方法执行完后执行异步处理的文章就介绍到这了,更多相关spring boot aop执行异步处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论