利用spring的BeanNameAutoProxyCreator做事务管理配置

在项目开发时候,很多目标bean需要生成事务代理,可以为每一个目标bean配置一个 TransactionProxyFactoryBean  bean。这样做的话,可能最后变成配置地狱,此时可以考虑使用自动事务代理。 

 
applicationContext.xml配置可以加入如下,不解释:
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
 
<beans>  
    <bean id="dataSource"  
        class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName">  
            <value>com.mysql.jdbc.Driver</value>  
        </property>  
        <property name="url">  
            <value>jdbc:mysql://localhost:3306/myuser</value>  
        </property>  
        <property name="username">  
            <value>lighter</value>  
        </property>  
        <property name="password">  
            <value>12345</value>  
        </property>  
    </bean>  
    <bean id="sessionFactory"  
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">  
                    org.hibernate.dialect.MySQLDialect  
                </prop>  
                <prop key="hibernate.show_sql">true</prop>  
            </props>  
        </property>  
        <property name="mappingResources">  
            <list>  
                <value>org/mmc/dao/domain/User.hbm.xml</value>  
            </list>  
        </property>  
    </bean>  
    <!-- 配置Hibernate的事务管理器 -->  
    <bean id="transactionManager"  
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
 
    <!-- 定义事务拦截器bean -->  
    <bean id="transactionInterceptor"  
        class="org.springframework.transaction.interceptor.TransactionInterceptor">  
        <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>  
 
    <!-- 定义BeanNameAutoProxyCreator-->  
    <bean  
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
        <property name="beanNames">  
        <!-- 所有名字以DAO,Service结尾的bean,将由该"bean后处理器"为其创建事务代理;实际上应该在业务层进行事务管理,这里只是举一个简单例子 -->  
            <value>*DAO,*Service</value>  
        </property>  
        <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->  
        <property name="interceptorNames">  
            <list>  
                <!-- 可以增加其他的拦截器 -->  
                <value>transactionInterceptor</value>  
            </list>  
        </property>  
    </bean>  
 
    <!-- 举下面这一个例子:这时候,这一个bean已经有了事务管理,可以增加类似的bean -->  
    <bean id="searchUserDAO" class="org.mmc.dao.impl.SearchUserDAO">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
</beans>
 
 
 

Leave a Comment.