Spring5 之 AOP 和動態代理,還有宣告式事務
阿新 • • 發佈:2021-09-28
動態代理 |
-
不修改原始碼的基礎上對方法增強
-
基於介面的動態代理
- JDK官方提供的類 Proxy,使用 newProxyInstance()方法建立代理物件。要求被代理類最少實現一個介面。
- newProxyInstance()方法的三個引數
-
基於子類的動態代理
- 匯入依賴
- 第三方 cglib 庫提供的 Enhancer 類中的 create()方法,要求被代理類不是最終類
- 匯入依賴
AOP 面向切面程式設計 |
- 通過預編譯方式和執行時動態代理實現程式功能的統一維護的技術。利用AOP可以對業務邏輯的各個部分進行隔離,降低耦合,提高程式的可重用性。簡單來說就是把重複的程式碼抽取出來,使用動態代理技術,在不修改原始碼的基礎上對已有的方法進行增強。
- 相關術語
- 連線點:在Spring中,這些點指的是方法
- 切入點:被增強的方法
- 通知、增強:對切入點做的增強,通知型別:前置通知、後置通知、異常通知、最終通知、環繞通知。
- 目標物件:就是被代理物件
- 織入:把增強應用到目標物件建立新的代理物件的過程
- 代理:增強後產生的物件
- 切面:切入點和增強的結合
Spring xml配置 AOP |
- 把服務和通知 bean 交給Spring 管理
<bean id="accountService" class="cn.demo.service.AccountServiceImpl"></bean> <bean id="log" class="cn.demo.utils.Logger"></bean>
//配置AOP <aop:config> //配置切面 <aop:aspect id="logAdvice" ref="log"> //配置通知型別,建立通知方法和切入點方法關聯 <aop:before method="beforeLog" pointcut="execution(* cn.demo.service.AccountServiceImpl.*(..))"></aop:before> //全通配:<aop:before method="beforeLog" pointcut="execution(* *..*.*(..))"></aop:before> </aop:aspect> </aop:config>
Spring 註解配置 AOP |
-
服務和通知使用@Service、@Component和@Aspect註解加入IOC容器,
通知裡的方法配置切入點@Pointcut、通知型別的註解:@Before(前置)、@AfterReturning後置、@AfterThrowing(異常)、@After(最終)、@Around(環繞)
-
xml檔案新增名稱空間,開啟註解掃描和AOP註解支援
<context:component-scan base-package="cn.demo"></context:component-scan> <!-- spring開啟AOP註解的支援 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
Spring 全註解配置 AOP |
Spring xml配置宣告式事務 |
<!-- spring中基於XML的宣告式事務控制配置步驟
1、配置事務管理器
2、配置事務的通知
此時我們需要匯入事務的約束 tx名稱空間和約束,同時也需要aop的
使用tx:advice標籤配置事務通知
屬性:
id:給事務通知起一個唯一標識
transaction-manager:給事務通知提供一個事務管理器引用
3、配置AOP中的通用切入點表示式
4、建立事務通知和切入點表示式的對應關係
5、配置事務的屬性
是在事務的通知tx:advice標籤的內部
-->
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事務的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 配置事務的屬性
isolation:用於指定事務的隔離級別。預設值是DEFAULT,表示使用資料庫的預設隔離級別。
propagation:用於指定事務的傳播行為。預設值是REQUIRED,表示一定會有事務,增刪改的選擇。查詢方法可以選擇SUPPORTS。
read-only:用於指定事務是否只讀。只有查詢方法才能設定為true。預設值是false,表示讀寫。
timeout:用於指定事務的超時時間,預設值是-1,表示永不超時。如果指定了數值,以秒為單位。
rollback-for:用於指定一個異常,當產生該異常時,事務回滾,產生其他異常時,事務不回滾。沒有預設值。表示任何異常都回滾。
no-rollback-for:用於指定一個異常,當產生該異常時,事務不回滾,產生其他異常時事務回滾。沒有預設值。表示任何異常都回滾。
-->
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
<!-- 配置aop-->
<aop:config>
<!-- 配置切入點表示式-->
<aop:pointcut id="pt1" expression="execution(* com.demo.service.impl.*.*(..))"></aop:pointcut>
<!--建立切入點表示式和事務通知的對應關係 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
Spring 註解配置宣告式事務 |
<!-- 配置spring建立容器時要掃描的包-->
<context:component-scan base-package="com.demo"></context:component-scan>
<!-- spring中基於註解 的宣告式事務控制配置步驟
1、配置事務管理器
2、開啟spring對註解事務的支援
3、在需要事務支援的地方使用@Transactional註解
-->
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 開啟spring對註解事務的支援-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
- 在需要事務支援的地方使用@Transactional註解
Spring 全註解註解配置宣告式事務 |
作者:湊數的園丁
出處:https://www.cnblogs.com/lq-404/
版權宣告: 本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
聲援博主: 如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。