简述
之前在项目中,使用到了多数据源切换,采用了AOP加自定义注解的方式去实现,但是当一个方法被同时标注有该注解以及@Transactional注解时,导致数据源一直是默认数据源,无法切换。
原因所在
当一个方法被两个切面增强时,两个切面的顺序是关键,使用@Order注解或者实现Ordered接口可以指定顺序,由开启注解式事务的注解@EnableTransactionManagement源码可知order默认为最大值Ordered.LOWEST_PRECEDENCE(2147483647),即最晚加载,但即便如此,标注有@Order的也要先于没有标注的切面优先执行。所以事务开启后,数据源此时还没有切换,即使后面AOP进行切换,事务管理器的数据源也不会发生变化。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
boolean proxyTargetClass() default false;
AdviceMode mode() default AdviceMode.PROXY;
int order() default Ordered.LOWEST_PRECEDENCE;
}
解决
在切面上标注@Order注解,并指定大小,小于Ordered.LOWEST_PRECEDENCE(2147483647)即可