用BeanNameAutoProxyCreator自動創建事務代理
下面介紹一種優秀的事務代理配置策略:採用這種配置策略,完全可以避免增量式配置,所有的事務代理由系統自動創建。容器中的目標bean自動消失,避免需要使用嵌套bean來保證目標bean不可被訪問。
這種配置方式依賴於Spring提供的bean後處理器,該後處理器用於爲每個bean自動創建代理,此處的代理不僅可以是事務代理,也可以是任意的代理,只需要有合適的攔截器即可。
下面是採用BeanNameAutoProxyCreator配置事務代理的配置文件:
[xhtml] view plaincopy
<?xml version="1.0" encoding="gb2312"?>
<!-- Spring配置文件的文件頭,包含DTD等信息-->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"[url]http://www.springframework.org/dtd/spring-beans.dtd[/url]">
<beans>
<!--定義數據源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 定義數據庫驅動-->
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<!-- 定義數據庫url-->
<property name="url"><value>jdbc:mysql://localhost:3306/spring</value></property>
<!-- 定義數據庫用戶名-->
<property name="username"><value>root</value></property>
<!-- 定義數據庫密碼-->
<property name="password"><value>32147</value></property>
</bean>
<!--定義一個hibernate的SessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 定義SessionFactory必須注入DataSource-->
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list>
<!--以下用來列出所有的PO映射文件-->
<value>Person.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!--此處用來定義hibernate的SessionFactory的屬性:
不同數據庫連接,啓動時選擇create,update,create-drop-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 定義事務管理器,使用適用於Hibernte的事務管理器-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- HibernateTransactionManager bean需要依賴注入一個SessionFactory bean的引用-->
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<!-- 配置事務攔截器-->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 事務攔截器bean需要依賴注入一個事務管理器 -->
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<!-- 下面定義事務傳播屬性-->
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>