Spring基于声明的事务管理方式

   基于注解的事务管理方式虽然使事务的管理变得很容易但是你还是需要把所有业务层的实现类都用@Transactional注解标记,那么有没有一种更为简单的一劳永逸的方法管理事务呢?

   基于声明的事务管理只需要少许的配置即可为所有业务层逻辑添加事务管理,在SpringMVC+Hibernate4+Bootstrap3基础上去除UserServiceImpl.java的@Transactional注解并修改applicationContext.xml为如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
			    		http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
						http://www.springframework.org/schema/tx 
						http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
						http://www.springframework.org/schema/context
				   		http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:property-placeholder location="classpath:db_info.properties"/>
	<aop:aspectj-autoproxy/>
	<!-- 只扫描被@Service @Repository注解标记的类 -->
	<context:component-scan base-package="com.zws" use-default-filters="false">
	  	<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" /> 
	    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" /> 
	</context:component-scan>
	
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClassName}"></property>
		<property name="jdbcUrl" value="${jdbc.url}"></property>
		<property name="user" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="checkoutTimeout" value="5000"></property>
		<property name="acquireIncrement" value="3"></property>
		<property name="maxIdleTime" value="60"></property>
		<property name="maxPoolSize" value="15"></property>
	</bean> 
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
	    <property name="dataSource" ref="dataSource"></property>
		<property name="hibernateProperties">
			<props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.format_sql">true</prop>  
                <prop key="hibernate.hbm2ddl.auto">update</prop>  
			</props>
		</property>
		<property name="packagesToScan">
			<list>
				<value>com.zws.user.beans</value>
			</list>
		</property>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<!---->
	
<!-- 	   声明式容器事务管理 ,transaction-manager指定事务管理器为transactionManager  -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="get*" propagation="REQUIRED" />
            <tx:method name="query*" propagation="REQUIRED" read-only="true" />
            <tx:method name="*" read-only="true" />
        </tx:attributes>
    </tx:advice>
    
    <!-- 只对业务逻辑层实施事务-->
    <aop:config>
        <aop:pointcut id="txPointcut" expression="execution(* com.zws..service.impl.*.*(..))" />
        <aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
    </aop:config>
	
</beans>

    tx:advice用于定义一个增强,此处的增强为事务管理,aop:pointcut用于定义切点,aop:advisor标签将事务管理增强作用于指定切点,从而达到对切点进行增强的目的。    

你可能感兴趣的:(spring,事务管理,声明式)