`

为啥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

    Spring MVC 提供了一种清晰的分离关注点的方式,允许开发者将业务逻辑、数据处理和用户界面分开。这种分离使得代码更易于测试、维护和扩展。 【Spring MVC 配置】 1. **Web.xml 配置**: 在 `web.xml` 文件中,...

    spring+springmvc+mybatis的整合

    这里就要导入mybatis和spring的整合包了,这里sqlsession中也要导入mybatis的配置文件 2.6 spring-bean 配置mapper自动扫描 MapperScannerConfigurer将扫描basePackage所指定的包下的所有接口类(包括子类), ...

    Spring+SpringMVC+Mybatis整合所需jar包以及xml配置文件配置方式

    在Java Web开发中,Spring、SpringMVC和Mybatis是三个非常重要的框架,它们的整合可以构建出高效、灵活的企业级应用。这三个框架各司其职,Spring作为基础框架负责依赖注入和事务管理,SpringMVC处理HTTP请求并转发...

    Spring Boot2 教程.pdf

    值得注意的是,如果要在SpringMVC中加载Spring容器,需要在SpringMVC配置的包扫描中包含`@Configuration`注解的类。另一种常见做法是将所有配置直接放在SpringMVC配置中,避免分开管理。 在实际开发中,第二种方案...

    spring+springMVC+Mybaits整合

    Spring、SpringMVC和MyBatis是Java开发中三大核心框架,它们的整合为开发者提供了高效、灵活的企业级应用开发解决方案。Spring作为一个全面的后端应用程序框架,负责管理对象(如bean)及其依赖关系;SpringMVC是...

    mybatis_spring

    - **分离配置**:将 MyBatis 的配置文件和 Spring 的配置文件分开,便于管理和维护。 - **事务策略**:根据业务需求选择合适的事务隔离级别和回滚规则,避免脏读、不可重复读等问题。 - **单元测试**:利用 ...

    SSM 整合 Layui Echarts图表

    1. **配置SSM框架**:设置Spring、Spring MVC和MyBatis的配置文件,包括数据库连接、扫描包路径、拦截器等。 2. **创建后端接口**:在Service层定义业务接口,然后在DAO层实现具体的数据库操作,通常使用MyBatis的...

    ssh 不出错的 lib

    然而,Spring的自动扫描和配置可能导致类路径下的类冲突,尤其是当多个库包含相同全限定名的类时。 2. **Struts框架**:Struts是基于MVC设计模式的Java Web应用框架,主要负责视图与控制器的交互。在整合其他框架时...

    springmvc+hibernate+注解

    Spring MVC、Hibernate 和注解是Java Web开发中的关键组件,它们共同构建了一个强大的后端框架。Spring MVC作为Spring框架的一部分,负责处理HTTP请求并提供响应,而Hibernate则是一个优秀的对象关系映射(ORM)工具...

    ssm整合配置

    在整合中,我们需要在Spring配置文件中配置MyBatis的SqlSessionFactory和MapperScannerConfigurer,前者用于创建SqlSession,后者用于扫描指定包下的Mapper接口。同时,需要将MyBatis的配置文件(如`mybatis-config....

    springMVC案例

    3. **分离关注点**:SpringMVC将模型、视图和控制器明确地分开,使得每个部分都有清晰的责任,有助于提高代码的可读性和可维护性。 4. **支持多种请求处理方式**:SpringMVC支持多种请求处理方式,包括基于方法名、...

    SpringMVC.pdf

    6. 将Spring和SpringMVC整合起来,配置Spring配置文件以扫描到SpringMVC中的Controller; 7. 准备MyBatis的配置文件,配置数据源和SqlSessionFactory等; 8. 将MyBatis与Spring整合,配置SqlSessionFactoryBean以及...

    ssm2.zip-项目案例代码

    1. **MVC设计模式**:SpringMVC遵循模型-视图-控制器架构,将业务逻辑、数据展示和用户交互分开,提高了代码的可维护性。 2. **Controller类**:通常会有一个或多个控制器类处理HTTP请求,例如`LoginController`,...

    基于IDEA的ssm聚合项目

    - 配置MyBatis,包括SqlSessionFactory、Mapper扫描和Mapper接口及XML文件的关联。 - 编写业务逻辑和服务接口,实现数据访问和业务处理。 - 创建和配置Tomcat服务器,部署项目运行。 8. **最佳实践** 在实际...

    pagehelper-fix分页插件

    2. **优化的分页效率**:PageHelper通过计算总记录数和分页查询分开执行,避免了全表扫描带来的性能问题,提升了分页查询的速度。 3. **灵活的API接口**:提供了多种分页参数设置方式,如RequestParam、Page对象、...

    外文翻译---JSP技术与主流JAVA+EE开源框架(SSH)技术简介.docx

    Struts提供了一种组织应用程序结构的方式,将业务逻辑、控制逻辑和表示逻辑分开,使代码更易维护和扩展。Struts 1.x版本在当时非常流行,但随着Struts 2的出现,提供了更现代的特性和更好的性能。 3. **Hibernate**...

    基于SSM架构实现的大型分布式购物网站-B2C项目源码+项目说明.zip

    使用扫描包的方式加载mapper的代理对象。 ###Service层 - 1、事务管理 - 2、需要把service实现类放到spring容器中管理 ###表现层 - 1、配置注解驱动 - 2、配置视图解析器 - 3、需要扫描controller ###web.xml -...

    struts2学习文档struts2pdf

    Struts2的核心设计原则之一是采用**Model-View-Controller (MVC)**模式,这有助于将业务逻辑、用户界面和控制逻辑分开,从而使得应用更加模块化和易于管理。 #### 二、Struts2框架的关键特点 1. **扩展性强**:...

    邮政

    1. **MVC设计模式**:Java应用程序常常采用Model-View-Controller(MVC)设计模式来组织代码,将业务逻辑、用户界面和数据访问分开,便于维护和扩展。在邮政系统中,模型层处理业务逻辑,视图层展示用户界面,控制器...

Global site tag (gtag.js) - Google Analytics