spring框架AOP(宣告式事務控制)
1 整合Hibernate事務控制
1.1 瞭解事務
我們一般說的事務是來源於關係資料庫,當有資料持久化需求時一般都需要事務控制。
關係資料庫:支援事務控制,mysql資料庫儲存引擎為InnoDB支援事務,儲存引擎為MyIsam不支援事務。
jdbc:支援事務控制,設定CommitAuto(false)
Hibernate:支援事務,使用session.beginTransaction(),再session.getTransaction().commit()提交事務
spring如果控制事務:由於使用hibernate
1.2 HibenateTemplate
spring針對持久層框架提供了模板類封裝資料庫操作方法:
1、可以簡化資料訪問的開發
2、支援事務控制,spring對Hibernate中session進行管理
spring提供了很多模板:
1、JdbcTemplate,針對jdbc操作資料庫模板,相當於DbUtil
2、HibernateTemplate,針對
1.3 加入jar
spring-orm-4.2.4.RELEASE.jar:spring針對orm框架整合包
spring-tx-4.2.4.RELEASE.jar:spring提供事務管理的包
spring-jdbc-4.2.4.RELEASE.jar:spring提供jdbc操作方法包,此包為事務控制的基礎包
1.4 測試HibenateTemplate
1.4.1dao
dao實現類繼承HibenrateDaoSupport(選擇
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) ;
}
瞭解jdk和cglib區別
jdk:基於介面生成代理物件
cglib:基於類生成代理物件
spring底層使用jdk和cglib,如果原始物件實現了一個介面,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>