Spring聲明式事務配置的兩種策略SpringAop和Bean後處理器的代理BeanNameAutoProxyCreator

      Spring的事務配置有兩種:1編程式事務管理配置;2聲明式事務管理配置。下面介紹兩種聲明式事務的配置,聲明式事務相比於編程式事務代碼耦合更低,無序書寫任何事務管理的先關代碼。兩種聲明式事務配置策略分別是:SpringAop事務管理和Bean後處理器的代理BeanNameAutoProxyCreator管理事務。

   1、SpringAop事務管理配置

       1.1、配置數據源:

     <bean id="pycDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${pyc.jdbc.driver}" />
		<property name="jdbcUrl" value="${pyc.jdbc.url}" />
		<property name="user" value="${pyc.jdbc.user}" />
		<property name="password" value="${pyc.jdbc.password}" />

		<property name="checkoutTimeout" value="30000" />
		<property name="idleConnectionTestPeriod" value="30" />
		<property name="maxIdleTime" value="30" />
		<property name="initialPoolSize" value="5" />
		<property name="minPoolSize" value="5" />
		<property name="maxPoolSize" value="20" />
		<property name="acquireIncrement" value="5" />

	</bean>

      1.2、配置事務管理器

       <!-- 配置事務管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

       1.3、配置事務增強處理Bean

         Spring提供了tx配置事務管理,<tx:advice.../>元素來配置事務增強處理,使用<aop:advisor.../>啓用代理。

   

     <!-- 配置事務增強處理Bean,指定事務管理器 -->
	<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
	    <!-- 配置詳細事務處理語義 -->
		<tx:attributes>
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />

			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
			
			<!-- 其他採用默認事務方式 -->
			<tx:method name="*"/>

		</tx:attributes>
	</tx:advice>

      1.4、AOP代理

   <!-- Spring aop事務管理 -->
	<aop:config>
	    <!-- 配置切入點 -->
		<aop:pointcut id="transactionPointcut"
			expression="execution(* org.andy.shop.service..*Impl.*(..))" />
		<!-- 指定在txAdvice切入點應用txAdvice事務增強處理 -->
		<aop:advisor pointcut-ref="transactionPointcut"
			advice-ref="transactionAdvice" />
	</aop:config>

 2、BeanNameAutoProxyCreator自動創建事務代理

          數據源的配置、事務管理器的配置和上面的一樣就在此處省略....

       2.3、事務攔截器

    <!-- 聲明式事務,事務攔截器 -->
	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager" ref="transactionManager" />
		<!-- 配置事務屬性 -->
		<property name="transactionAttributes">
			<!--下面定義事務傳播屬性 -->
			<props>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>

     2.4、定義BeanNameAutoProxyCreator

       BeanNameAutoProxyCreator,該bean是個bean後處理器,無需被引用,因此沒有id屬性這個bean後處理器,根據事務攔截器爲目標bean自動創建事務代理,BeanNameAutoProxyCreator是個根據bean名生成自動代理的代理創建器,該bean通常需要接受兩個參數。第一個是beanNames屬性,該屬性用來設置哪些bean需要自動生成代理。另一個屬性是interceptorNames,該屬性則指定事務攔截器,自動創建事務代理時,系統會根據這些事務攔截器的屬性來生成對應的事務代理。

    

	<!-- Bean後處理器BeanNameAutoProxyCreator,根據List配置創建事務代理 -->
	<bean
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<!-- 下面是所有需要自動創建事務代理的bean -->
		<property name="beanNames">
			<list>
				<value>*Services</value>
			</list>
		</property>
		<!-- 下面定義BeanNameAutoProxyCreator所需的事務攔截器 -->
		<property name="interceptorNames">
			<list>
				<value>transactionInterceptor</value>
			</list>
		</property>
	</bean>

博客來源http://blog.csdn.net/fengshizty



      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章