根據代理機制不一樣,有如下幾種配置方式:(推薦使用第四種方式,作spring的事物)java
首先定義一個接口和實現類,並在此基礎上進行配置---spring
Java代碼 express
public interface IUserDao { public void insertUser(UserTable user); }
Java代碼 session
public class UserDaoImpl extends HibernateDaoSupport implements IUserDao{ public void insertUser(UserTable user) { getHibernateTemplate().saveOrUpdate(user); } }
<!-- 每一個bean都有一個代理 --> spa
<beans> <!-- sessionFactory至關於spring datasource --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定義事務管理器(聲明式的事務) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置DAO --> <bean id="userDao" class="org.lgh.spring.transaction2.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 每一個bean都有一個代理 <property name="target" ref="userDaoTarget" /> --> <bean id="userDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置事務管理器 --> <property name="transactionManager" ref="transactionManager" /> <property name="target" ref="userDao" /> <property name="proxyInterfaces" value="org.lgh.spring.transaction2.IUserDao" /> <!-- 配置事務屬性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>
<!-- 全部的bean共享一個代理--> <beans> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定義事務管理器(聲明式的事務) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 全部的bean共享一個代理/> --> <bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"> <!-- 配置事務管理器 --> <property name="transactionManager" ref="transactionManager" /> <!-- 配置事務屬性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!-- 配置DAO --> <bean id="userDao" class="org.lgh.spring.transaction3.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 全部的bean共享一個代理/> --> <bean id="userDaoProxy" parent="transactionBase" > <property name="target" ref="userDao" /> </bean> </beans>
<!-- 使用攔截器 --> <beans> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定義事務管理器(聲明式的事務) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <!-- 配置事務屬性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean name="logger" class="org.lgh.spring.transaction4.SpringAOPInterceptor"> </bean> <bean id="logBeforeAdvice" class="com.spring.advices.LogBeforeAdvice"> </bean> <!-- 定義BeanNameAutoProxyCreator,該bean是個bean後處理器,無需被引用,所以沒有id屬性 這個bean後處理器,根據事務攔截器爲目標bean自動建立事務代理 --> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 加上此句就不會拋出 $Proxy cannot be cast的異常啦--> <property name="proxyTargetClass"> <value>true</value> </property> <property name="beanNames"> <list> <!-- *Dao對應下面的userDao要對它進行攔截--> <value>userDao</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> <value>logBeforeAdvice</value> </list> </property> </bean> <!-- 配置DAO --> <bean id="userDao" class="org.lgh.spring.transaction4.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 服務層 service--> <bean id="userService" class="org.lgh.spring.transaction4.UserServiceImpl"> <property name="userDao" ref="userDao" /> </bean> </beans>
<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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package="org.lgh.spring.transaction5" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定義事務管理器(聲明式的事務) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true" > <aop:pointcut id="interceptorPointCuts" expression="execution(* org.lgh.spring.transaction5.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config> <!-- 配置DAO --> <bean id="userDao" class="org.lgh.spring.transaction5.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>
execution(* org.lgh.spring.transaction5.*.*(..))中:hibernate
第一個 * —— 通配 任意返回值類型|代理
|第二個 * —— 通配 包org.lgh.spring.transaction5下的任意class|code
|第三個 * —— 通配 包org.lgh.spring.transaction5下的任意class的任意方法|component
|第四個 .. —— 通配 方法能夠有0個或多個參數|orm
<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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package="org.lgh.spring.transaction6" /> <tx:annotation-driven proxy-target-class ="true" transaction-manager="transactionManager"/> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定義事務管理器(聲明式的事務) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置DAO --> <bean id="userDao" class="org.lgh.spring.transaction6.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>