SpringMVC事务配置问题

使用SpringMVC时,可选择:

1、SpringIOC和SpringMVC共用容器(所有配置springmvc的配置文件中);

2、SpringIOC和SpringMVC不共用容器(即使用两个不同的配置文件applicationContext.xml, springmvc.xml);

其中第1种方式直接配置即可,本文讨论第2种方式,配置文件(非全部):

applicationContext.xml(业务实例)

<context:component-scan base-package="*" >
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
	
<!-- 	多数据源动态切换 -->
	<bean id="dynamicDataSource" class="com.aires.base.spring.ds.DynamicDataSource" >
<!-- 		<property name="targetDataSources"> -->
<!-- 			<map> -->
<!-- 				<entry key="ds" value-ref="dataSource"></entry> -->
<!-- 				<entry key="ds0" value-ref="dataSource0"></entry> -->
<!-- 			</map> -->
<!-- 		</property> -->
		<property name="defaultTargetDataSource" ref="dataSource"></property>
	</bean>	
	
	<bean id="dynamicDataSourceAdvice" class="com.aires.base.spring.ds.DynamicDataSourceAdvice" />
	
	<!-- 配置SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dynamicDataSource" />
		<property name="hibernateProperties">
			<props>
<!-- 				<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> -->
<!-- 				<prop key="hibernate.hbm2ddl.auto">update</prop> -->
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
			</props>
		</property>
		<property name="packagesToScan" value="**..bean" />
	</bean>
	
	<!-- 使用hibernate事务管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
<!-- 事务策略 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="*" propagation="SUPPORTS" read-only="true" />
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut id="transactionPoint" expression="execution(* *..service..*.*(..)) " />
		<aop:advisor pointcut-ref="transactionPoint" advice-ref="dynamicDataSourceAdvice" />
		<aop:advisor pointcut-ref="transactionPoint" advice-ref="txAdvice" />			
	</aop:config>


springmvc.xml(Controller实例)

<context:component-scan base-package="*" use-default-filters="false">
    	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>


为什么component-scan中要使用exclude和include?

隔离和去冗余:

1)此时存在两个spring容器,假设applicationContext.xml容器为A,springmvc.xml容器为M,则A为M的父容器;

2)A中包含dao、service等业务实例,事务在A的service上;若A不用exclude,则A中也会有Controller实例,且并不会生效,这些实例是多余的;

3)若M不用include,则M中会有dao、service等实例,而这些实例第一在A中已经存在,第二由于M中不存在事务申明,所以M中的service是不存在事务的;

4)M中的controller需要注入service实例,其查找路径大概为:本容器-->父容器,当存在3的情况时,注入到controller中的实际为本容器的不存在事务的service,此时不但冗余,还将导致事务配置不生效。


以上为个人观点,有问题欢迎指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值