为什么spring不扫描controller层注解,springmvc不扫描sevice层注解:
再springmvc中,经常配置两个xml,一个spring专属,一个springmvc专属,再这两个xml中都可以配置bean的自动扫描。一般我们都在spring中不扫描controller,在springmvc中不扫描service和respository。
原因:
Spring和springmvc作为两个独立的容器,会把扫描到的注解分别放到两个不同的容器中,springmvc容器是spring容器的一部分,他们访问对象的分为如下:
Springmvc子容器可以访问spring父容器中的对象。
Spring父容器不能访问springmvc子容器中的对象。
问题出现:
1、全部放到spring.xml
如果全部放到spring.xml中,spring会把扫描到的对象存放到spring的容器,而不会放到springmvc子容器,当访问项目的时候,springmvc找不到处理器映射器,和其相应的controller,进而报404错误。
全部放到springmvc
如果不用spring容器,同时扫描controller、service、dao层,但子容器controller进行扫描装配时装配了@service注解的实例,而该实例应该由父容器进行初始化以保证事务的增强处理,因为事务福利器配置在spring容器中,所以初始得到的将是原样的service(没有进攻事务加强处理,故而没有事务处理能力。)同理,springmvc中配置controller后也就不能将事务配置在controler层,因为事务管理器是配置在spring容器中的,如果将事务配置在controller层的话,spring容器因为不能分为springmvc子容器,进而无法访问到事务对象,进而导致事务失效。