Spring聲明式事務如何選擇代理方式
解決方法:
1.基於注解方法:
-
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
2.基於xml配置方法:
<aop:config expose-proxy="true" proxy-target-class="false">
</aop:config>
默認false,選擇jdbc代理模式,true使用cglib代理模式。
jdbc代理模式和cglib代理模式優缺點比較:
-
若目標對象實現了若干接口,spring使用JDK的java.lang.reflect.Proxy類代理。
優點:因為有接口,所以使系統更加松耦合
缺點:為每一個目標類創建接口 -
若目標對象沒有實現任何接口,spring使用CGLIB庫生成目標對象的子類。
優點:因為代理類與目標類是繼承關系,所以不需要有接口的存在。
缺點:因為沒有使用接口,所以系統的耦合性沒有使用JDK的動態代理好。