版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
1.概述
Spring对异步执行的支持和@Async注解的使用。
用@Async注释bean的方法将使它在单独的线程中执行。 换句话说,调用者将不等待被调用方法的完成。
Spring中一个有趣的方面是,框架中的事件支持在必要时也支持异步处理。
2.启用异步支持
首先通过Java配置启用异步处理。
通过将@EnableAsync添加到配置类中来完成此操作:
@Configuration@EnableAsyncpublicclassSpringAsyncConfig{}
启用注解就足够了。 还有一些奇特的配置选项:
annotation默认情况下,@EnableAsync检测Spring的@Async注解和EJB 3.1 javax.ejb.Asynchronous。 也可以使用此选项来检测其他用户定义的注释类型。
mode指示应使用的建议类型-基于JDK代理或AspectJ编织。
指示应如何应用异步建议。
默认值为AdviceMode.PROXY。 请注意,代理模式仅允许通过代理拦截呼叫。 同一类内的本地调用无法以这种方式被拦截; 在本地调用中,此类方法上的Async注释将被忽略,因为Spring的拦截器甚至不会在这种运行时场景中起作用。 有关更高级的拦截模式,请考虑将其切换为AdviceMode.ASPECTJ。
proxyTargetClass指示应使用的代理类型-CGLIB或JDK。 仅当模式设置为AdviceMode.PROXY时,此属性才有效。
order设置应用AsyncAnnotationBeanPostProcessor的顺序。 默认情况下,它最后运行,以便可以考虑所有现有代理。
3. @Async注解
@Async有两个限制:
它只能应用于公共方法。自我调用(从同一类中调用async方法)将无法正常使用。
原因很简单:该方法需要公开,才能被代理。 而且自调用不起作用,因为它绕过了代理并直接调用了底层方法。
3.1.无返回类型的方法
这是配置具有void返回类型的方法以异步运行的简单方法:
@Asyncpublicvoi