Spring框架之为什么不在spring容器管理controller,而交给mvc

Spring容器与SpringMVC容器

1.疑问:为什么不用spring去管理所有类?

我们配置springMVC 中,为什么controller不直接交给spring 管理而要spring MVC容器单独分开来管理

2.Spring容器 与 SpringMVC关系

Spring容器与SpringMVC容器是父子关系,子容器可以访问父容器的对象,父容器不能访问子容器的类,如果我们在springMVC配置

文件中,直接扫描所有类,把service、dao、controller都交给SpringMVC去管理是可以的,但是假如用spring去管理

Contoller,它是访问不到这个类的,因为contoller是在springMVC容器中,假如在Spring配置直接扫描所有类包括

controller,而不配置springMVC的话,这样服务器发来的请求,将会出现404的问题,因为它找不到controller,spring

无法注入Controller

例如:

在applicationContext-service中配置:

会扫描@Controller、@Service、@Repository、@Compnent

Springmvc.Xml中不扫描。

结论:springmvc。不能提供服务,因为springmvc子容器中没有controller对象。

3.为什么不直接在SpringMVC.xml中扫描所有类?

原则上我们是可以把service、dao

和controller都交给springMVC去管理,直接在SpringMVC配置文件中让它扫所有包就可以,但是出于未来扩展的考虑,spring

和springMVC分开配置,由 spring 去管理service,有利于以后扩展,即便以后加多个struct2也不用影响原有配置

------------------------------------------------------------------------------------------------------------------------------------

一、Spring容器和springmvc容器的关系如下图所示:

Spring框架之为什么不在spring容器管理controller,而交给mvc

Spring和springmvc和作为两个独立的容器,会把扫描到的注解对象分别放到两个不同的容器中,

Springmvc容器是spring容器的一部分,他们访问对象的范围如下所示:

①:springmvc子容器可以访问spring父容器中的对象

②:spring父容器不能访问springmvc子容器中的对象

***在实际应用中的实例***

一般情况下,一个spring / springmvc / mybatis 组合的框架中,会存在以下几个配置文件:

  1. applicationContext-service.xml 文件
  2. 说明:在这个里面存在着一个spring的注解扫描器。用来扫描@Service的注解
  3. Springmvc.xml 文件
  4. 说明:这个里面存在着springmvc的注解扫描器,专门用来扫描@Controller的注解
  5. 然后呢?有点同学可能会想,我能不能合并成一个注解扫描器,来完成对象注入的问题?将配置文件中的注解扫描器更改为如下配置:
  6. 在applicationContext-service.xml文件中进行全局扫描的配置:
  7. 而在springmvc中不配置注解扫描器
  8. 说明:用这个扫描器分别扫描service层和controller层的注解:@Service /@Controller / @Autowired
  9. 当一旦采用这种方式之后,spring会将扫描的对象都会存放到spring的容器,而不会放到springmvc子容器中,当访问项目的时候,
  10. springmvc找不到处理器映射器,和其对应的Controller,进而报404错误!
  11. 不用spring容器,只用springmvc容器行不行呢?
  12. 答案:是可以的,在这个里面可以同时扫描Controller层、service层、dao层的注解。
  13. 在springmvc 和 spring 都有注解扫描的前提下,能不能将事务配置在Controller层?
  14. 答案:是不能的,因为事务管理器是配置在spring容器中的,如果将事务配置在Controller层的话,spring容器就访问不了springmvc子容器,
  15. 进而无法访问到事务对象。进而导致事务失效。

以上部分内容转自:https://www.cnblogs.com/Prozhu/p/6709320.html


分享到:


相關文章: