Spring的声明式事务有以下几种配置方法:
1、ProxyFactoryBean/Transaction Interceptor
2、TransactionProxyFactoryBean
3、BeanNameAutoProxyCreator
4、Source-Level Metadata Using Commons Attributes
5、Source-Level Metadata Using J2SE 5.0 Annotations
个人认为4和5第一次配置完成后,以后再增加新的bean时会比较简单,但单单从配置文件上看不易理解。
本人推荐使用2,配置也十分简单,比较容易理解,利用维护人员的维护工作,在我做的项目中都是使用这种配置方式。
另外最好每个模块单独一个配置文件,在web.xml中contextConfigLocation的param-value中全部加进来。这样实际上就解决了使用2时产生的配置文件太大的问题。
例子:
dataAccess-hibernate.xml
<!-- The DBCP DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
<!-- The transactionmanager to use for regular non JTA datasource -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
ticket-service.xml (ticket模块)
<!-- Transactional proxy and the primary business object -->
<bean id="ticket.proxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target">
<ref local="ticket.service"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>
<prop key="allocate*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- The Service class -->
<bean id="ticket.service" class="org.springframework.prospring.ticket.service.BoxOfficeImpl">
<property name="boxOfficeDao">
<ref local="ticket.dao"/>
</property>
</bean>
<!-- The DAO class -->
<bean id="ticket.dao" class="org.springframework.prospring.ticket.dao.jdbc.JdbcBoxOfficeDao">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dataAccess-jdbc.xml /WEB-INF/conf/ticket-services.xml </param-value>
</context-param>
这是本人在项目中采取的配置。proxy注入service,service注入dao,配置简单明了,如果一个模块中有多个Service类,可以依次添加即可。