SpringMVC与Spring的整合无非就是在Spring的基础上增加了SpringMVC的配置xxx-servlet.xml
Hibernate与Spring的整合无非就是将通过hibernate.cfg.xml获得的SessionFactory交给SpringIOC管理
Spring单与hibernate整合时:
以下配置了JdbcTemplate和hibernateTemplate交由统一事务管理器管理事务
<context:property-placeholder location="classpath:*db.properties" ignore-unresolvable="true" ignore-resource-not-found="false"/>
<!-- 数据库连接 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver.name}"></property>
<property name="url" value="${db.url}"></property>
<property name="username" value="${db.username}"></property>
<property name="password" value="${db.password}"></property>
<!--initialSize: 初始化连接-->
<property name="initialSize" value="5"/>
<!--maxIdle: 最大空闲连接-->
<property name="maxIdle" value="20"/>
<!--minIdle: 最小空闲连接-->
<property name="minIdle" value="5"/>
<!--maxActive: 最大连接数量-->
<property name="maxActive" value="200"/>
<!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒-->
<property name="maxWait" value="3000"/>
</bean>
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties" >
<props >
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.release_mode">after_transaction</prop>
</props>
</property>
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property>
<!-- 扫描映射关系类 -->
<property name="packagesToScan" value="com.muchen.*"></property>
</bean>
<!-- 配置jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置hibernateTemplate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 将jdbcTemplate和hibernateTemplate 交给同一个事务管理器管理,达到同时提交和同时回滚的目的 -->
<property name="sessionFactory" ref="sessionFactory"></property>
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
当整合了MVC时,在Spring的配置文件ApplicationContext.xml和MVC的配置文件xxx-servlet.xml中都会有
<context:component-scan base-package="com.muchen">
在启动IOC时扫描了一次,然后发起请求初始化DispatchServlet时又扫描了一次,后面一次的扫描会覆盖之前一次的扫描,而且xxx-servlet.xml中的扫描组件是没有配置事务的,所以在多次重复扫描组件时可能导致事务无效。
为了避免此类情况出现,配置文件应做如下修改:在IOC配置中
<context:component-scan base-package="com.muchen">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
也就是扫描除了Controller的其他组件,其实也可以连Controller一起扫,只不过为了避免MVC配置里重复扫描Controller。
在xxx-servlet.xml配置:只扫描Controller就行了,理论上只要不扫入含有事务的组件就行了
<context:component-scan base-package="com.muchen" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
use-default-filters:是否自动检测带有@Component、@Repository、@Service或@Controller的类。默认设置是“true”