我们知道,springMVC框架是spring容器的一个子容器,因此在某些方面它们可以达到一个共同的效果,接下来我们来介绍一下在spring容器和springMVC扫描包的两种方式。
1、将扫描器全部配置于springMVC中
<!--以下映射器和适配器的配置可以通过注解驱动来代替 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- SpringMVC的扫描范围 -->
<context:component-scan base-package="com.yzh.maven.*" />
说明:由于springMVC时spring的一个子容器,其特点是可以使用父容器的实例,因此我们可以将扫描器全部配置于springMVC中,但是这种扫描有可能会导致事务失去效果,因为spring和springMVC时明确分工的,一个可以接管事务和数据源以及其他bean的维护以及bean之间关系的维护;另一个则是管理web层的框架,用于处理视图解析、拦截器等相关操作,主要用于对controller层的操作。
注意:如果springMVC扫描不到controller层,那么客户端发来的*.action请求也会报告404的错误!另外,不能将扫描器全部配置于spring中,因为父容器不能访问子容器springMVC的实例(controller实例,这个实例需要由springMVC解析)。
2、springMVC管理controller层,spring管理除controller之外的所有层
(1)在spring容器中配置除controller之外的所有层的扫描器
<context:component-scan base-package="com.yzh.maven.*">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
(2)在springMVC中配置controller层的扫描器
<context:component-scan base-package="com.yzh.maven.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
说明:由于框架本身的特点,springMVC管理controller层,spring管理除controller之外的所有层,官方更推荐使用第二种扫描方式。