使用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,此时不但冗余,还将导致事务配置不生效。
以上为个人观点,有问题欢迎指正,谢谢!