您的位置:首页 > 编程语言 > Java开发

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: