Spring事务支持:利用继承简化配置
因为事务代理的实现类是 TransactionProxyFactoryBean 。 事务代理Bean必须注入事务管理器。
大部分情况下,每个事务代理的事务属性大同小异,对于这种情况,Spring提供了Bean 与Bean之间的继承,可以简化配置。将大部分的通用配置,配制成事务模板。而实际的事务代理Bean,则继承事务模板。
其配置文件如下:
<?xml version = "1.0" encoding = "UTF-8"?> <!-- Spring 配置文件的文件头,包含DTD等信息 --> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.spingframework.org/dtd/spring-beans.dtd"> ... <!-- 定义事务管理器,使用适用于Hibernate的事务管理 --> <bean id = "transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <!-- HibernateTransactionManager bean 需要依赖注入一个SessionFactory bean 的引用 --> <property name = "sessionFactory"> <ref local = "sessionFactory" /> </property> </bean> <!-- 配置事务模版,模版Bean被设置成abstract bean ,保证不会被初始化 --> <bean id = "txBase" class = "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init = "true" abstract = "true" > <!-- 为事务模版注入事务管理器 --> <property name = "transactionAttributes" > <props> <prop key = "find*"> PROPAGATION_REQUIRED,readOnly</prop> <prop key = "*" > PROPAGATION_REQUIRED</prop> </prop> </property> </bean> <!-- 实际的事务代理Bean --> <bean id = "xsDao" parent = "txBase"> <!-- 采用嵌套Bean配置目标Bean--> <property name = "target"> <bean class = "org.dao.imp.XsDaoImp"> <property name = "sessionFactory"> <ref local= "sessionFactory" > </property> </bean> </property> </bean>
这比直接采用TransactionProxyFactoryBean 的事务代理配置方式,大大减少配置配置文件的代码量。每个事务代理的配置都继承事务模板,无需重复指定事务代理的实现类,无需重复指定传播属性。