Spring事务配置详解
2010-11-23 10:30
387 查看
由于好长时间没用SSH2,今天搭建一个小的项目熟悉熟悉,注册用户时发现系统和数据库无法同步,添加的数据不能立刻保存到数据库,只有重新部署或者重新
启动项目才能保存,上网查了一下,发现Spring事务没有配置。本以为是件很easy的事情,但后来发现没想象的那么容易,可能是以前学习spring
时,事务这方面根本就没有关注过,所以造成今天很难理解的局面。不过好在最后弄懂了(在网上查到spring事务配置有好多种,我只用了其中的两种),为
了让还没有弄懂的童鞋们不至于摸不着头脑,就把网上那篇流传很久的配置,加上自己的理解,献给大家。
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
[b]DataSource、
TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为
SessionFactory,TransactionManager的实现为 HibernateTransactionManager
具体如下图:
根据代理机制的不同,总结了五种Spring事务的配置方式,现在我把我使用的两种配置文件写出来:
一:所有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"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >
<!-- 配置sessionFactory
-->
<
bean
id
="sessionFactory"
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<
property
name
="configLocation"
value
="classpath:hibernate.cfg.xml"
>
</
property
>
</
bean
>
<!-- 配置dataSource
-->
<
bean
id
="dataSource"
class
="org.apache.commons.dbcp.BasicDataSource"
>
<
property
name
="driverClassName"
value
="oracle.jdbc.driver.OracleDriver"
>
</
property
>
<
property
name
="url"
value
="jdbc:oracle:thin:@localhost:1521:orcl"
>
</
property
>
<
property
name
="username"
value
="langxi"
>
</
property
>
<
property
name
="password"
value
="hello"
>
</
property
>
</
bean
>
<!-- 定义事务管理器
-->
<
bean
id
="transactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
="sessionFactory"
ref
="sessionFactory"
>
</
property
>
</
bean
>
<!-- lazy-init详解
<beans>
<bean id="b1" lazy-init="true"/>
<bean id="b2" lazy-init="false">
<property name="b1" ref="b1"/>
</bean>
</beans>
以上两个bean的区别是:当IOC容器启动时,b2会实例化,而b1不会被实例化,但是容易实例化b2时也把b1实例化了
原因是b2需要b1,也就是说lazy-init为“true”的bean,IOC容器启动时不会被实例化,只有当需要用时才会被实例化
好处是lazy-init提高容器效率,对于不需要的bean可以先不管
-->
<!-- abstract="true" 抽象bean、该bean不会被实例化(提高效率),只是一个模板,用来作为父类,其他bean可以继承(parent)它
-->
<
bean
id
="transactionBase"
class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init
="true"
abstract
="true"
>
<!-- 配置事务管理器
-->
<
property
name
="transactionManager"
ref
="transactionManager"
>
</
property
>
<!-- 配置事务属性
-->
<
property
name
="transactionAttributes"
>
<
props
>
<
prop
key
="*"
>
PROPAGATION_REQUIRED</
prop
>
</
props
>
</
property
>
</
bean
>
<
bean
id
="userDaoTarget"
class
="com.user.dao.impl.UserDaoImpl"
>
<
property
name
="sessionFactory"
ref
="sessionFactory"
>
</
property
>
</
bean
>
<!-- 以前的写法 和现在相比就是中间又加了一层关系
<bean id="userDao" class="com.user.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
-->
<
bean
id
="userDao"
parent
="transactionBase"
>
<
property
name
="target"
ref
="userDaoTarget"
>
</
property
>
</
bean
>
<
bean
id
="userService"
class
="com.user.service.impl.UserServiceImpl"
>
<
property
name
="userDao"
ref
="userDao"
>
</
property
>
</
bean
>
<
bean
id
="loginAction"
class
="com.user.action.LoginAction"
>
<
property
name
="userService"
ref
="userService"
>
</
property
>
</
bean
>
</
beans
>
二:[b]使用拦截器
[/b]
[b]
<?
xml
version
="1.0"
encoding
="UTF-8"
?>
<
beans
xmlns
="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >
<!-- 配置sessionFactory
-->
<
bean
id
="sessionFactory"
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<
property
name
="configLocation"
value
="classpath:hibernate.cfg.xml"
>
</
property
>
</
bean
>
<!-- 配置dataSource
-->
<
bean
id
="dataSource"
class
="org.apache.commons.dbcp.BasicDataSource"
>
<
property
name
="driverClassName"
value
="oracle.jdbc.driver.OracleDriver"
>
</
property
>
<
property
name
="url"
value
="jdbc:oracle:thin:@localhost:1521:orcl"
>
</
property
>
<
property
name
="username"
value
="langxi"
>
</
property
>
<
property
name
="password"
value
="hello"
>
</
property
>
</
bean
>
<!-- 定义事务管理
-->
<
bean
id
="transactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
="sessionFactory"
>
<
ref
local
="sessionFactory"
/>
</
property
>
</
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
>
<
bean
id
="userDao"
class
="com.user.dao.impl.UserDaoImpl"
>
<
property
name
="sessionFactory"
ref
="sessionFactory"
>
</
property
>
</
bean
>
<
bean
id
="userService"
class
="com.user.service.impl.UserServiceImpl"
>
<
property
name
="userDao"
ref
="userDao"
>
</
property
>
</
bean
>
<
bean
id
="loginAction"
class
="com.user.action.LoginAction"
>
<
property
name
="userService"
ref
="userService"
>
</
property
>
</
bean
>
</
beans
>
[/b]
[/b]
启动项目才能保存,上网查了一下,发现Spring事务没有配置。本以为是件很easy的事情,但后来发现没想象的那么容易,可能是以前学习spring
时,事务这方面根本就没有关注过,所以造成今天很难理解的局面。不过好在最后弄懂了(在网上查到spring事务配置有好多种,我只用了其中的两种),为
了让还没有弄懂的童鞋们不至于摸不着头脑,就把网上那篇流传很久的配置,加上自己的理解,献给大家。
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
[b]DataSource、
TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为
SessionFactory,TransactionManager的实现为 HibernateTransactionManager
具体如下图:
根据代理机制的不同,总结了五种Spring事务的配置方式,现在我把我使用的两种配置文件写出来:
一:所有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"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >
<!-- 配置sessionFactory
-->
<
bean
id
="sessionFactory"
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<
property
name
="configLocation"
value
="classpath:hibernate.cfg.xml"
>
</
property
>
</
bean
>
<!-- 配置dataSource
-->
<
bean
id
="dataSource"
class
="org.apache.commons.dbcp.BasicDataSource"
>
<
property
name
="driverClassName"
value
="oracle.jdbc.driver.OracleDriver"
>
</
property
>
<
property
name
="url"
value
="jdbc:oracle:thin:@localhost:1521:orcl"
>
</
property
>
<
property
name
="username"
value
="langxi"
>
</
property
>
<
property
name
="password"
value
="hello"
>
</
property
>
</
bean
>
<!-- 定义事务管理器
-->
<
bean
id
="transactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
="sessionFactory"
ref
="sessionFactory"
>
</
property
>
</
bean
>
<!-- lazy-init详解
<beans>
<bean id="b1" lazy-init="true"/>
<bean id="b2" lazy-init="false">
<property name="b1" ref="b1"/>
</bean>
</beans>
以上两个bean的区别是:当IOC容器启动时,b2会实例化,而b1不会被实例化,但是容易实例化b2时也把b1实例化了
原因是b2需要b1,也就是说lazy-init为“true”的bean,IOC容器启动时不会被实例化,只有当需要用时才会被实例化
好处是lazy-init提高容器效率,对于不需要的bean可以先不管
-->
<!-- abstract="true" 抽象bean、该bean不会被实例化(提高效率),只是一个模板,用来作为父类,其他bean可以继承(parent)它
-->
<
bean
id
="transactionBase"
class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init
="true"
abstract
="true"
>
<!-- 配置事务管理器
-->
<
property
name
="transactionManager"
ref
="transactionManager"
>
</
property
>
<!-- 配置事务属性
-->
<
property
name
="transactionAttributes"
>
<
props
>
<
prop
key
="*"
>
PROPAGATION_REQUIRED</
prop
>
</
props
>
</
property
>
</
bean
>
<
bean
id
="userDaoTarget"
class
="com.user.dao.impl.UserDaoImpl"
>
<
property
name
="sessionFactory"
ref
="sessionFactory"
>
</
property
>
</
bean
>
<!-- 以前的写法 和现在相比就是中间又加了一层关系
<bean id="userDao" class="com.user.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
-->
<
bean
id
="userDao"
parent
="transactionBase"
>
<
property
name
="target"
ref
="userDaoTarget"
>
</
property
>
</
bean
>
<
bean
id
="userService"
class
="com.user.service.impl.UserServiceImpl"
>
<
property
name
="userDao"
ref
="userDao"
>
</
property
>
</
bean
>
<
bean
id
="loginAction"
class
="com.user.action.LoginAction"
>
<
property
name
="userService"
ref
="userService"
>
</
property
>
</
bean
>
</
beans
>
二:[b]使用拦截器
[/b]
[b]
<?
xml
version
="1.0"
encoding
="UTF-8"
?>
<
beans
xmlns
="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >
<!-- 配置sessionFactory
-->
<
bean
id
="sessionFactory"
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<
property
name
="configLocation"
value
="classpath:hibernate.cfg.xml"
>
</
property
>
</
bean
>
<!-- 配置dataSource
-->
<
bean
id
="dataSource"
class
="org.apache.commons.dbcp.BasicDataSource"
>
<
property
name
="driverClassName"
value
="oracle.jdbc.driver.OracleDriver"
>
</
property
>
<
property
name
="url"
value
="jdbc:oracle:thin:@localhost:1521:orcl"
>
</
property
>
<
property
name
="username"
value
="langxi"
>
</
property
>
<
property
name
="password"
value
="hello"
>
</
property
>
</
bean
>
<!-- 定义事务管理
-->
<
bean
id
="transactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<
property
name
="sessionFactory"
>
<
ref
local
="sessionFactory"
/>
</
property
>
</
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
>
<
bean
id
="userDao"
class
="com.user.dao.impl.UserDaoImpl"
>
<
property
name
="sessionFactory"
ref
="sessionFactory"
>
</
property
>
</
bean
>
<
bean
id
="userService"
class
="com.user.service.impl.UserServiceImpl"
>
<
property
name
="userDao"
ref
="userDao"
>
</
property
>
</
bean
>
<
bean
id
="loginAction"
class
="com.user.action.LoginAction"
>
<
property
name
="userService"
ref
="userService"
>
</
property
>
</
bean
>
</
beans
>
[/b]
[/b]
相关文章推荐
- 详解Spring配置事务的五种方式
- spring的annotation-driven配置事务管理器详解
- spring的annotation-driven配置事务管理器详解
- spring的annotation-driven配置事务管理器详解
- 【Spring】spring-mvc hibernate druid jdbc等数据源事务配置详解(解决注解事务不生效问题)
- Spring事务Transaction配置的五种注入方式详解
- Spring事务的配置详解:AOP配置数据库操作的事务
- Spring事务配置及事务的传播性与隔离级别详解
- spring的annotation-driven配置事务管理器详解
- Spring事务配置详解
- Spring、Spring事务详解;使用XML配置事务
- Spring事务配置详解
- Spring事务Transaction配置的五种注入方式详解
- spring的annotation-driven配置事务管理器详解
- spring :annotation-driven配置事务管理器详解
- spring 事务配置详解
- Spring事务Transaction配置的五种注入方式详解
- spring 事务配置例子详解
- spring的annotation-driven配置事务管理器详解
- spring的annotation-driven配置事务管理器详解