1. 程式人生 > >spring框架AOP(宣告式事務控制)

spring框架AOP(宣告式事務控制)

 

整合Hibernate事務控制

 

1.1 瞭解事務

我們一般說的事務是來源於關係資料庫,當有資料持久化需求時一般都需要事務控制。

 

關係資料庫:支援事務控制,mysql資料庫儲存引擎為InnoDB支援事務,儲存引擎為MyIsam不支援事務。

jdbc:支援事務控制,設定CommitAuto(false)

Hibernate:支援事務,使用session.beginTransaction(),session.getTransaction().commit()提交事務

spring如果控制事務:由於使用hibernate

springHibernatesession進行管理,支援事務。

 

 

1.2 HibenateTemplate

 

spring針對持久層框架提供了模板類封裝資料庫操作方法:

 

1、可以簡化資料訪問的開發

 

2、支援事務控制,springHibernatesession進行管理

 

 

 

spring提供了很多模板:

 

1JdbcTemplate,針對jdbc操作資料庫模板,相當於DbUtil

 

2HibernateTemplate,針對

Hibernate操作資料庫模板。

 

1.3 加入jar

 

spring-orm-4.2.4.RELEASE.jarspring針對orm框架整合包

 

spring-tx-4.2.4.RELEASE.jarspring提供事務管理的包

 

spring-jdbc-4.2.4.RELEASE.jarspring提供jdbc操作方法包,此包為事務控制的基礎包

 

1.4 測試HibenateTemplate

 

1.4.1dao

 

dao實現類繼承HibenrateDaoSupport(選擇

hibernate對應版本,一般選第5版)

1.4.2 配置dao

 

<bean id="customerTestDao" class="cn.itcast.crm.dao.impl.CustomerTestDaoImpl">

 

</bean>

 

 

 

執行報錯:

 

'sessionFactory' or 'hibernateTemplate' is required

 

由於dao繼承HibernateDaoSupport執行需要'sessionFactory''hibernateTemplate'

 

 

 

解決:

 

'sessionFactory' or 'hibernateTemplate'注入到dao中。

 

<!-- 載入db.properties配置檔案 -->

 

         <context:property-placeholder location="classpath:db.properties"/>

 

         <!--  -->

 

         <bean id="customerTestDao" class="cn.itcast.crm.dao.impl.CustomerTestDaoImpl">

 

          <property name="hibernateTemplate" ref="hibernateTemplate"/>

 

         </bean>

 

         

 

         <!-- hibernateTemplate,依賴了sessionFactory -->

 

         <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">

 

          <property name="sessionFactory" ref="sessionFactory"></property>

 

         </bean>

 

         <!-- 配置 sessionFactory,依賴dataSource資料來源(資料庫連線池)-->

 

         <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

 

          <!-- 資料來源 -->

 

          <property name="dataSource" ref="dataSource"/>

 

         </bean>

 

         

 

         <!-- spring對  資料來源進行管理 -->

 

         <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

 

          <!-- mysql的驅動包 -->

 

          <property name="driverClass" value="${jdbc.driver}" />

 

          <!-- 連線資料庫url -->

 

<property name="jdbcUrl" value="${jdbc.url}" />

 

<property name="user" value="${jdbc.username}" />

 

<property name="password" value="${jdbc.password}" />

 

         </bean>

 

報錯:

Unable to locate persister: cn.itcast.crm.domain.CstCustomer

CstCustomer不是一個被hibenate管理的實體型別。

解決:

在建立SessionFacotry時候載入Hibenate 對映檔案:

以上是和hibernate框架進行整合,

2基於aop使用宣告式事務控制

 

2.1 什麼是aop

當前service開發中問題:

每個需要進行事務控制的service程式碼中事務控制部分程式碼重複的程式碼,將這些事務控制重複的程式碼抽取出來。

 

解決方法:

採用spring aop面向切面程式設計對上邊的程式碼進行抽取

 

 

AOP Aspect Oriented Programing 面向切面程式設計。Spring1.2 版本開始支援AOP程式設計 (面向切面程式設計 )。

採用aop的方法對類程式碼切面程式設計,通過橫向抽取方法將service中的事務控制的程式碼抽取出來。

 

2.2 aop的原理

 

aop面向切面程式設計的原理就是代理:

 

1、靜態代理

 

採用一些工具類對原來的類生成一個代理類,代理類以.class存在

 

 

 

2、動態代理(重點,spring基於動態代理實現aop

 

 在執行中,通過反射生成類的代理物件,在代理物件中對原來的物件進行增強。

 

 

spring採用動態代理的技術包括:

1基於介面生成代理物件(重點)

根據介面方法生成代理物件,對原來的代理物件進行增強

使用jdk提供反射實現

 

2基於類生成代理物件

根據類生成一個子類(代理物件),在代理物件(子類)中對父類進行增強。

使用CGLib實現

 

編寫原始類:

 

public interface CustomerServiceAop {

 

public void insertCustomer(CstCustomer cstCustomer,CstCustomerDetail cstCustomerDetail) ;

 

 

 

}

 瞭解jdkcglib區別

jdk:基於介面生成代理物件

 

cglib:基於類生成代理物件

 

spring底層使用jdkcglib,如果原始物件實現了一個介面,spring使用jdk,否則 使用cglib生成代理。

 

AOP聯盟

 

AOP聯盟出一套aop的標準。

 

aop聯盟的jar包:

aop術語:

 

Pointcut(切入點):確定在哪個方法上增強,一個類有多個切點

 

Advice(通知/增強):在切點上進行增強,包括:前置增強、後置增強、丟擲異常增強

 

Target(目標物件):對目標物件進行增強,生成代理物件

 

Proxy(代理):對目標物件進行增強,生成代理物件

Weaving(織入):生成代理的時機(過程)

1動態代理織入,在執行期為目標類生成代理物件

2、編譯期織入

Aspect(切面): 包括切點和增強,面向哪個切點進行增強(程式設計)。

AspectJ語法(切點語法):

通過語法配置切入點:

切入點:方法,哪個/哪個/方法

 

表示式包括兩部分:函式名和操作引數。

例子:execution(* cn.itcast.spring.service.impl.*.*(..))  匹配cn.itcast.spring.service.impl包下所有類的所有方法(任意形參),任意返回值。

 

 增強

AspectJ支援的增強型別:

n Before 前置增強/通知,相當於BeforeAdvice

n AfterReturning 後置增強/通知,相當於AfterReturningAdvice

n Around 環繞增強/通知,相當於MethodInterceptor

n AfterThrowing丟擲增強/通知,相當於ThrowAdvice

After 最終finally增強/通知,不管是否異常,該通知都會執行

 下面就開始逐層配置:

dao:

還是用上面寫好的繼承hibernamteTemplate

 service

 

事務管理器

 

applicatoinContext-transaction.xml

配置增強(實現事務 管理)

 

加入約束:

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop" 

xmlns:tx="http://www.springframework.org/schema/tx" 

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd 

http://www.springframework.org/schema/context 

http://www.springframework.org/schema/context/spring-context.xsd 

http://www.springframework.org/schema/aop 

http://www.springframework.org/schema/aop/spring-aop.xsd 

http://www.springframework.org/schema/tx  

http://www.springframework.org/schema/tx/spring-tx.xsd">

 

 

 

 

<!-- 切面

包括:切點和增強

 -->

<aop:config>

<!-- 使用aop:advisor配置切面,和 tx:advice配置使用實現事務控制

advice-ref :指定引用增強

-->

<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.crm.service.impl.*.*(..))"/>

</aop:config>