-
核心机制
通过BeanPostProcessor注入代理对象
异步执行
AnnotationAsyncExecutionInterceptor<—AsyncExecutionInterceptor <— MethodInterceptor#invoke
2、源码分析
-
启用异步注解 @EnableAsync,@Import(AsyncConfigurationSelector.class),找到对应的配置类 ProxyAsyncConfiguration;--EnableXXX类注解原理
-
AsyncAnnotationBeanPostProcessor 实现了BeanFactoryAware 和 BeanPostProcessor两个接口
-
硬编码使用 AsyncAnnotationAdvisor 作为AOP切面
-
在服务器启动时,依赖BeanPostProcessor#postProcessAfterInitialization生成代理对象
-
生成代理类时会把Advisor应用到代理工厂
-
AsyncAnnotationAdvisor 实现了 PointcutAdvisor接口,对切入点和通知的包装
-
PointcutAdvisor是AOP框架抽象的切面接口
-
切入点默认匹配@Async注解
-
通知对应的是 AnnotationAsyncExecutionInterceptor,MethodInterceptor的实现,真正的执行逻辑
3、应用
-
通过实现AsyncConfigurer自定义线程池及异常处理
-
如果需要返回值需要使用Future类型
-
必须是类之间的调用才会生效,类内部方法调用异步注解不生效(同@Transactional)
* 在异步方法中应避免查询主线程插入或更新的数据,因为CPU的切换无法保证执行顺序
4、扩展
@Transactional注解是怎么实现的?
启用事务:@EnableTransactionManagement
切面:BeanFactoryTransactionAttributeSourceAdvisor
切入点:AnnotationTransactionAttributeSource
org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource#computeTransactionAttribute
通知:TransactionInterceptor implements MethodInterceptor