Spring的容器事務主要是基于動態AOP來處理。
下面這段xml配置片斷展示了Spring中的事務設定方式:
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/sample</value>
</property>
<property name="username">
<value>user</value>
</property>
<property name="password">
<value>mypass</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="userDAO" class="net.xiaxin.dao.UserDAO">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="userDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">
PROPAGATION_REQUIRED,readOnly
</prop>
</props>
</property>
</bean>
</beans>
------------------------------------------------------------------------------------------------------------------------------------------------------------------
EJB事務處理與Spring事務處理的區別,關鍵兩點:
1、Spring可以將任意Java Class 納入事務管理這里的UserDAO只是我們編寫的一個普通Java Class,其中包含了一些基本的數據應用邏輯。通過Spring,我們即可簡單的實現事務的可配置化。也就是說,我們可以隨意為某個類的某個方法指定事務管理機制。與之對比,如果使用EJB容器提供的事務管理功能,我們不得不按照EJB規范編將UserDAO 進行改造,將其轉換為一個標準的EJB。
2、Spring事務管理并不依賴特定的事務資源。EJB 容器必須依賴于JTA 提供事務支持。而Spring 的事務管理則支持JDBC、JTA 等多種事務資源。這為我們提供了更多的選擇,從而也使得我們的系統部署更加靈活。