Spring配置

来源:互联网 发布:拆分数据公式 编辑:程序博客网 时间:2024/06/02 13:28
一直想整理一下spring事务配置的问题,但是总是感觉表达的不够精确,今天在一本书上发现了这个问题,感觉说的挺到位的,就拿出来分享一下吧。
spring利用AOP机制来提供事务服务,事务管理器(TransactionManager)充当切面的作用。当某个目标对象的某些方法需要使用声名式事务方式服务的时候,首先需要创建TranstactionManager的Bean,该Bean一般需要一个数据源,例如hibernate的SessionFactory,然后再为目标Bean加上这样的切面即可,并且配好事务的属性(transactionAttributes)。

it_man的博客里看到一副spring事务配置的图,觉得挺有用的,这里就copy过来吧。

 
具体的配置可以参见下面的代码:
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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"><bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName"value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/ylss"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource"><ref bean="dataSource" /></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><!-- 将Hibernate后台执行的sql动作都打印到控制台上 --><prop key="hibernate.show_sql">true</prop> </props></property><property name="mappingResources"><list><value>com/leec/ylss/model/DTO/YlssZsType.hbm.xml</value><value>com/leec/ylss/model/DTO/YlssKeywords.hbm.xml</value><value>com/leec/ylss/model/DTO/YlssDataFrom.hbm.xml</value><value>com/leec/ylss/model/DTO/YlssWebpages.hbm.xml</value><value>com/leec/ylss/model/DTO/YlssSystem.hbm.xml</value><value>com/leec/ylss/user/model/DTO/YlssUser.hbm.xml</value><value>com/leec/ylss/model/DTO/YlssZs.hbm.xml</value></list></property></bean><!-- *************************************************************************** --><!--设定Hibernate事务管理类,定义事务管理器,需要引入sessionFactory --><bean id="myTransactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><!-- 配置事务拦截器--><bean id="transactionInterceptor"class="org.springframework.transaction.interceptor.TransactionInterceptor"><!-- 事务拦截器bean 需要依赖注入一个事务管理器--><property name="transactionManager"><ref bean="myTransactionManager" /></property><property name="transactionAttributes"><!-- 下面定义事务传播属性--><props><!-- DAO常见方法前缀以及BO常见方法前缀,适用于DAO或BO的事务管理--><!--为代理对象定义自己的事务属性:  1、PROPAGATION_REQUIRED :支持当前的事务,如果不存在就创建一个新的。这是最常用的选择。   2、PROPAGATION_SUPPORTS :支持当前的事务,如果不存在就不使用事务。   3、PROPAGATION_MANDATORY :支持当前的事务,如果不存在就抛出异常。   4、PROPAGATION_REQUIRES_NEW :创建一个新的事务,并暂停当前的事务(如果存在)。   5、PROPAGATION_NOT_SUPPORTED :不使用事务,并暂停当前的事务(如果存在)。   6、PROPAGATION_NEVER :不使用事务,如果当前存在事务就抛出异常。   7、PROPAGATION_NESTED :如果当前存在事务就作为嵌入事务执行,否则与PROPAGATION_REQUIRED类似。--><prop key="new*">PROPAGATION_REQUIRED,-Exception</prop><prop key="save*">PROPAGATION_REQUIRED,-Exception</prop><prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop><prop key="reg*">PROPAGATION_SUPPORTS,readOnly</prop><prop key="attach*">PROPAGATION_REQUIRED,-Exception</prop><prop key="merge*">PROPAGATION_REQUIRED,-Exception</prop><prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop><prop key="del*">PROPAGATION_REQUIRED,-Exception</prop></props></property></bean><!--定义BeanNameAutoProxyCreator ,该bean 是个bean 后处理器,无须被引用,因此没有id 属性,这个bean 后处理器,根据事务拦截器为目标bean 自动创建事务代理--><bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><!--指定对满足哪些bean name 的bean 自动生成业务代理--><property name="beanNames"><!-- 下面是所有需要自动创建事务代理的bean--><list><!--  此处可增加其他需要自动创建事务代理的bean --><!--  情况:DWR3的service无法增加到这里与spring集成,目前只能从使用new的方式了 --><value>SysService</value>
</list></property><!--下面定义BeanNameAutoProxyCreator所需的事务拦截器--><property name="interceptorNames"><list><value>transactionInterceptor</value></list></property></bean><!--  定义业务对象 --><bean id="SysService" class="com.leec.ylss.service.SysService" lazy-init="true"><!-- 依赖注入 --><property name="datafromdao"><ref bean="YlssDataFromDAO" /></property><property name="sysdao"><ref bean="YlssSystemDAO" /></property></bean><bean id="YlssZsTypeDAO"class="com.leec.ylss.model.DAO.YlssZsTypeDAO"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><bean id="YlssKeywordsDAO"class="com.leec.ylss.model.DAO.YlssKeywordsDAO"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><bean id="YlssDataFromDAO"class="com.leec.ylss.model.DAO.YlssDataFromDAO"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><bean id="YlssWebpagesDAO"class="com.leec.ylss.model.DAO.YlssWebpagesDAO"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><bean id="YlssSystemDAO"class="com.leec.ylss.model.DAO.YlssSystemDAO"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><bean id="YlssUserDAO"class="com.leec.ylss.user.model.DAO.YlssUserDAO"><property name="sessionFactory"><ref bean="sessionFactory"></ref></property></bean><bean id="YlssZsDAO" class="com.leec.ylss.model.DAO.YlssZsDAO"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean></beans>