高效开发:Spring和SpringMVC的父子关系

Posted Java架构师(公众号:毛奇志)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高效开发:Spring和SpringMVC的父子关系相关的知识,希望对你有一定的参考价值。

子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean

Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean。所以,可以在@Controller中注入@Service,@Component,@Repository等Bean,但是反过来就不行。

@Service,@Repository,@Component为什么要与@Controller要分开配置扫描。在SpringMVC的配置文件中扫描Controlller Bean(@Controller),在Spring的配置文件中扫描除了Controller的其他Bean(如@Service,@Repository,@Component等)。

处理方式(分开扫描和两种极端)

1、极端:配置文件中,仅使用Spring扫描所有的bean,答案是不可以。

理由:SpringMVC在匹配Controller与url的映射关系时只会在自己的上下文中查找Controller进行请求的处理。由于所有Controller的都在Spring容器中,SpringMVC找不到Controller对象,报404错误。(另外,此时的@Controller Bean可以注入@Service Bean中,因为两者都在Spring容器中,@Controller Bean可以被Spring注入)

2、第一个极端修改:Spring扫描所有Bean,SpringMVC扫描@Controller Bean,答案是可以。

没有问题,Controller与URL正常映射。此外,@Service Bean可以注入@Controller Bean(来自Spring容器非SpringMVC容器)。

3、极端:仅使用SpringMVC扫描所有的bean,答案是可以。

这就是自家项目的配置方法,使用上完全没有问题。所以我们项目中根本没有使用Spring的容器,而是用的SpringMVC的容器。(我们的项目就是用是springmvc扫描所有spring注解,不包括@Mapper,它是ibatis注解)

尾声

分开扫描的好处是便于扩展,如果要是项目需要加入Struts等可以整合进来,分开配置可以使SpingMVC和Struts都使用可使用Spring中的Bean。若只使用SpringMVC扫描,那么Struts中无法使用SpringMVC中的Bean。

以上是关于高效开发:Spring和SpringMVC的父子关系的主要内容,如果未能解决你的问题,请参考以下文章

Spring和SpringMVC父子的容器之道---[上篇]

面试高频题:Spring和SpringMvc父子容器你能说清楚吗

面试高频题:Spring和SpringMVC父子容器你能说清楚吗

Spring源码解析:父子容器的概念

Spring MVC学习—Spring MVC中容器的层次结构以及父子容器的概念

使用专家构建,整合Dubbo+动物园管理员+SpringMVC+Spring+MyBatis+Redis支持分布式的高效率便捷开发框架