`

为啥Spring和Spring MVC包扫描要分开?

 
阅读更多

 

    背景:

      最近在搭建新工程的时候发现有些Spring的配置不是很了解,比如Spring 配置里面明明配置了component-scan,为啥Spring MVC配置文件还需要配置一下,这样岂不是多此一举?由于以前基本是在现有的工程上直接开发或者别的工程的配置文件直接拷贝过来,所以也没太关注这个问题。出于好奇,谷歌了一下发现原来这个里面大有学问呢,详情请见下文。正常代码如下:

 

<!-- spring 配置文件-->
<context:component-scan base-package="com.xxx.xxx.account.front">
	 <context:exclude-filter type="annotation" 
         expression="org.springframework.stereotype.Controller" />
</context:component-scan>

<!-- spring mvc -->	
<context:component-scan base-package="com.xxx.xxx.account.front.web" use-default-filters="false">
	<context:include-filter type="annotation" 
        expression="org.springframework.stereotype.Controller" />
</context:component-scan>

    

    测试bean

@Service
public class TestService implements InitializingBean { 

    @Autowired
    private PersonalAddressAjaxController personalAddressAjaxController;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("--------------------------------");
    }
}

 

    原理:   

      原来Spring 是父容器, Spring MVC是子容器, 子容器可以访问父容器的bean,父容器不能访问子容器的bean。 

     具体参照:

      Spring和SpringMVC父子容器关系初窥

      Spring为什么不做全局包扫描

      Spring与SpringMVC的容器关系分析

 

    测试一: Spring加载全部bean,MVC加载Controller

<!-- spring 配置文件-->
<context:component-scan base-package="com.xxx.xxx.account.front">
</context:component-scan>

<!-- spring mvc -->	
<context:component-scan base-package="com.xxx.xxx.account.front.web" use-default-filters="false">
	<context:include-filter type="annotation" 
        expression="org.springframework.stereotype.Controller" />
</context:component-scan>

    

    测试结果:TestService通过,界面显示正常。

    原因:父容器加载了全部bean,所以Service 能访问到Controller。MVC容器默认查找当前容器,能查到有转发的Controller规则所以界面正常跳转。

 

    测试二:Spring加载全部Bean,MVC容器啥也不加载

<!-- spring 配置文件-->
<context:component-scan base-package="com.xxx.xxx.account.front">
</context:component-scan>

<!-- spring mvc -->	
无

    测试结果:TestService通过,界面显示404。

    原因:父容器加载了全部bean,所以Service 能访问到Controller。MVC容器默认查找当前容器的Controller,找不到所以界面出现404。

 

   测试三:Spring加载所有除了Controller的bean,MVC只加载Controller

<!-- spring 配置文件-->
<context:component-scan base-package="com.xxx.xxx.account.front">
	 <context:exclude-filter type="annotation" 
         expression="org.springframework.stereotype.Controller" />
</context:component-scan>

<!-- spring mvc -->	
<context:component-scan base-package="com.xxx.xxx.account.front.web" use-default-filters="false">
	<context:include-filter type="annotation" 
        expression="org.springframework.stereotype.Controller" />
</context:component-scan>

    测试结果:TestService初始化失败,如果注释掉该bean,界面正常。

    原因:父容器不能访问子容器的bean。

 

    测试四:Spring不加载bean,MVC加载所有的bean

<!-- spring 配置文件-->
无

<!-- spring mvc -->	
<context:component-scan base-package="com.xxx.xxx.account.front.web" use-default-filters="true">
</context:component-scan>

    测试结果:TestService通过,界面正常。

    原因:因为所有的bean都在子容器中,也能查到当前容器中的Controller,所以没啥问题。

 

 

    疑问一: 单例的bean在父子容器中存在一个实例还是两个实例?

    答:初始化两次,Spring 容器先初始化bean,MVC容器再初始化bean,所以应该是两个bean。

 

    疑问二:为啥不把所有bean 都在子容器中扫描?

    答: 网上很多文章说子容器不支持AOP,其实这是不对的。因为正常会有AOP的相关配置都在Spring容器中配置,如果都迁移到MVC配置文件,则所有bean都在子容器中,相当于只有一个容器了,所以也就实现了AOP。缺点是不利于扩展。

    

 

 

 

 

0
0
分享到:
评论

相关推荐

    Spring MVC jar包

    关于构建Sping MVC的Jar包,包括Sping2.5.6和Hibernate3.6.8

    Spring MVC所需jar包

    Spring MVC所需jar包,包含java开发中 Spring MVC架构中最常用的jar包

    spring-webmvc jar包

    spring-webmvc-4.1.0.RELEASE.jar用于Spring框架的mvc注解

    精通Spring MVC 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    spring-webmvc-5.2.15.RELEASE-API文档-中文版.zip

    赠送jar包:spring-webmvc-5.2.15.RELEASE.jar; 赠送原API文档:spring-webmvc-5.2.15.RELEASE-javadoc.jar; 赠送源代码:spring-webmvc-5.2.15.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-...

    spring-webmvc5.3.6 jar包.rar

    这个jar文件包含Spring MVC框架相关的所有类。  包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。  当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的...

    spring MVC环境搭建 所需jar包.zip

    spring MVC环境搭建 所需jar包 ├── commons-logging-1.1.1.jar ├── jstl.jar ├── spring-aop-4.3.0.RELEASE.jar ├── spring-aspects-4.3.0.RELEASE.jar ├── spring-beans-4.3.0.RELEASE.jar ├...

    spring-webmvc-5.0.9 jar包、源码和javadoc

    spring-webmvc-5.0.9 jar包、源码和javadoc,官网无修改版本。

    Spring MVC4.1.6jar包

    Spring MVC4.1.6jar包Spring MVC4.1.6jar包Spring MVC4.1.6jar包Spring MVC4.1.6jar包

    spring-webmvc-5.0.8.RELEASE-API文档-中文版.zip

    赠送jar包:spring-webmvc-5.0.8.RELEASE.jar; 赠送原API文档:spring-webmvc-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-webmvc-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-5.0.8....

    spring-webmvc-5.3.10-API文档-中文版.zip

    赠送jar包:spring-webmvc-5.3.10.jar; 赠送原API文档:spring-webmvc-5.3.10-javadoc.jar; 赠送源代码:spring-webmvc-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-5.3.10.pom; 包含翻译后的API...

    spring mvc 整合包

    spring mvc 快速开发jar包下载。

    Spring,Spring MVC所需的jar包

    Spring,Spring MVC所需的jar包

    spring框架的MVC

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还可以是...

    spring-mvc jar包大全

    spring MVC所有的jar包,用于Java EE web开发,搭建spring mvc

    Spring MVC依赖包

    Spring mvc依赖包 Spring mvc都做了些什么 Controller为中心完成对系统流程的控制管理 从请求中搜集数据 对传入的参数进行验证 将结果返回给视图 针对不同的视图提供不同的解决方案 针对jsp视图技术提供标签库 拦截...

    springfox-spring-webmvc-3.0.0-API文档-中英对照版.zip

    赠送jar包:springfox-spring-webmvc-3.0.0.jar; 赠送原API文档:springfox-spring-webmvc-3.0.0-javadoc.jar; 赠送源代码:springfox-spring-webmvc-3.0.0-sources.jar; 赠送Maven依赖信息文件:springfox-...

    sentinel-spring-webmvc-adapter-1.8.0-API文档-中文版.zip

    赠送jar包:sentinel-spring-webmvc-adapter-1.8.0.jar; 赠送原API文档:sentinel-spring-webmvc-adapter-1.8.0-javadoc.jar; 赠送源代码:sentinel-spring-webmvc-adapter-1.8.0-sources.jar; 赠送Maven依赖信息...

    spring-webmvc-5.1.3.RELEASE-API文档-中文版.zip

    赠送jar包:spring-webmvc-5.1.3.RELEASE.jar; 赠送原API文档:spring-webmvc-5.1.3.RELEASE-javadoc.jar; 赠送源代码:spring-webmvc-5.1.3.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-5.1.3....

    spring-webmvc-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-webmvc-5.0.8.RELEASE.jar; 赠送原API文档:spring-webmvc-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-webmvc-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-webmvc-5.0.8....

Global site tag (gtag.js) - Google Analytics