記錄一次AOP存在的問題

簡述

之前在項目中,使用到了多數(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)即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容