簡述
之前在項目中,使用到了多數(shù)據(jù)源切換,采用了AOP加自定義注解的方式去實現(xiàn),但是當一個方法被同時標注有該注解以及@Transactional注解時,導致數(shù)據(jù)源一直是默認數(shù)據(jù)源,無法切換。
原因所在
當一個方法被兩個切面增強時,兩個切面的順序是關(guān)鍵,使用@Order注解或者實現(xiàn)Ordered接口可以指定順序,由開啟注解式事務的注解@EnableTransactionManagement源碼可知order默認為最大值Ordered.LOWEST_PRECEDENCE(2147483647),即最晚加載,但即便如此,標注有@Order的也要先于沒有標注的切面優(yōu)先執(zhí)行。所以事務開啟后,數(shù)據(jù)源此時還沒有切換,即使后面AOP進行切換,事務管理器的數(shù)據(jù)源也不會發(fā)生變化。
@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)即可