spring的事务打点设置
当前位置:以往代写 > JAVA 教程 >spring的事务打点设置
2019-06-14

spring的事务打点设置

spring的事务打点设置

副标题#e#

一般的,我们把事务配在service层,操作service的业务逻辑接口统一的打点。

为什么不消在dao层呢?

因为一个service有大概挪用多个dao,而这多个dao有大概彼此接洽,有时候一个操纵需要挪用多次数据库,可是这多次挪用要么全提交,要么全回滚。

因此,在dao层挪用事务理论上说不是一个很明智的选择。应该有业务逻辑层service层认真事务,统一处理惩罚。

Spring设置文件中关于事务设置老是由三个构成部门,别离是DataSource、TransactionManager和署理机制这三部门,

无论哪种设置方法,一般变革的只是署理机制这部门。

DataSource、TransactionManager这两部门只是会按照数据会见方法有所变革,好比利用Hibernate举办数据会见时,

DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。

第一种方法:每个Bean都有一个署理

<?xml version="1.0" encoding="UTF-8"?>   
<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"
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/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
      
      
<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="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<bean id="userDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    
<!-- 设置事务打点器 -->    
<property name="transactionManager" ref="transactionManager"  />       
<property name="target" ref="userDaoTarget"  />    
<property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao"  />   
<!-- 设置事务属性 -->    
<property name="transactionAttributes">    
<props>    
<prop key="*">PROPAGATION_REQUIRED</prop>   
</props>    
</property>    
</bean>    
</beans>

第二种方法:所有Bean共享一个署理基类

<?xml version="1.0" encoding="UTF-8"?>   
<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"
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/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
      
      
<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="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="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
      
      
<bean id="userDao" parent="transactionBase" >    
<property name="target" ref="userDaoTarget"  />     
</bean>   
</beans>


#p#副标题#e#

#p#分页标题#e#

第三种方法:利用拦截器

<?xml version="1.0" encoding="UTF-8"?>   
<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"
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/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">   
      
      
<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 class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
<property name="beanNames">    
<list>    
<value>*Dao</value>   
</list>    
</property>    
<property name="interceptorNames">    
<list>    
<value>transactionInterceptor</value>    
</list>    
</property>    
</bean>    
      
      
<!-- 设置DAO -->   
<bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">   
<property name="sessionFactory" ref="sessionFactory"  />   
</bean>   
</beans>

第四种方法:利用tx标签设置的拦截器

<?xml version="1.0" encoding="UTF-8"?>   
<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/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   
      
      
<context:annotation-config  />   
<context:component-scan base-package="com.bluesky"  />   
      
      
<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="*" propagation="REQUIRED"  />   
</tx:attributes>   
</tx:advice>   
      
      
<aop:config>   
<aop:pointcut id="interceptorPointCuts"
expression="execution(* com.bluesky.spring.dao.*.*(..))"  />   
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts"  />          
</aop:config>        
</beans>

#p#副标题#e#

#p#分页标题#e#

第五种方法:全注解

<?xml version="1.0" encoding="UTF-8"?>   
<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/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   
      
      
<context:annotation-config  />   
<context:component-scan base-package="com.bluesky"  />   
      
      
<tx:annotation-driven 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>   
      
      
</beans>

此时在DAO上需加上@Transactional注解,如下:

package com.bluesky.spring.dao;   
      
      
import java.util.List;   
      
      
import org.hibernate.SessionFactory;   
import org.springframework.beans.factory.annotation.Autowired;   
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
import org.springframework.stereotype.Component;   
      
      
import com.bluesky.spring.domain.User;   
      
      
@Transactional
@Component("userDao")   
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {   
      
      
public List<User> listUsers() {   
return this.getSession().createQuery("from User").list();   
}   
}

    关键字:

在线提交作业