1. 程式人生 > 其它 >Spring5 之 AOP 和動態代理,還有宣告式事務

Spring5 之 AOP 和動態代理,還有宣告式事務

動態代理

  • 不修改原始碼的基礎上對方法增強

  • 基於介面的動態代理

    • 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 許可協議。轉載請註明出處!

聲援博主: 如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。