哪些方法不可以實施Spring AOP事務java
因爲Spring事務管理是基於接口代理或動態字節碼技術。經過AOP實施事務加強。web
基於接口動態代理的AOP事務加強,接口方法必須都是public的。spring
實現類的方法也必須都是public的。不可以有protected、private、final數據庫
基於CGLib字節碼動態代理的方案是經過擴展被加強類,動態建立子類的方式進行AOP加強植入的。spa
因爲final、static private修飾的方法不可以被子類覆蓋。想用的,該方法就沒法實施AOP加強。代理
<aop:config proxy-target-class="true">orm
<aop:pointcut id="serviceJdbcMethod" expretion="execution(* com.baobaotao.special.UserService.*(..))"/>接口
<asp:advisor pointcut-ref="serviceJdbcMethod" advice-ref="jdbcAdvice" order="0"/>事務
</aop:config>ci
<tx:advice id="jdbcAdvice" transaction-manager="jdbcManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
不能被Spring Aop事務加強的方法
序號 |
動態代理策略 |
不能被事務加強的方法 |
1 |
基於接口的動態代理 |
除public之外其它全部的方法,此外public static也不可以被加強 |
2 |
基於CGLIB的動態代理 |
private 、static、final方法。 |
這些不可以被事務加強的方法也能夠經過其它事務調用該方法被歸入到事務當中來。他們不可以被spring Aop直接事務加強,可是外層方法的事務上下文依舊能夠順利地傳播到這些方法中。
在編寫數據庫鏈接的時候必定不要產生鏈接泄露的狀況。在有事務的環境下使用spring提供的DataSourceutils 能夠由spring保證無鏈接泄露,在麼有事務環境下面,咱們須要經過手動在finally上執行
DataSourceUtils.releaseConnection(conn,getDataSource());
另一種可以保證鏈接不泄露的方法就是數據源
java API反射類
java.lang.reflect.invocationHandler
java.lang.refect.Method
java.lang.reflect.Proxy