springMVC 不扫描 controller 中的方法

论坛 期权论坛 脚本     
匿名技术用户   2020-12-29 22:24   947   0

在springmvc中,我们经常配置两个xml,一个spring专属,一个springMVC专属,在这两个xml中我们都可以配置bean的自动扫描。
一般我们在spring.xml中不扫描@Controller注解,在springmvc.xml中不扫描@service和@Repository

在主容器中(applicationContext.xml),将Controller的注解排除掉
<context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

而在springMVC配置文件中将Service注解给去掉
<context:component-scan base-package="com">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
1
2
3
4
5
6
7
8
9
10
为什么要这么做呢?
Spring容器和springmvc容器的关系如下图所示:

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

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

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

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

1.如果全部把注解放到spring.xml中配置:
当一旦采用这种方式之后,spring会将扫描的对象都会存放到spring的容器,而不会放到springmvc子容器中,当访问项目的时候,springmvc找不到处理器映射器,和其对应的Controller,进而报404错误!

2.不用spring容器,把注解全部放到springmvc中扫描:
是可以的,在这个里面可以同时扫描Controller层、service层、dao层的注解,但是,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理(因为事务管理器是配置在spring容器中的),所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。同理,springmvc中配置controller后也不能将事务配置在controller层,因为因为事务管理器是配置在spring容器中的,如果将事务配置在Controller层的话,spring容器就访问不了springmvc子容器,进而无法访问到事务对象。进而导致事务失效。

直接扫描的方式:
直接扫描比较省事,但是事务回得不到处理,所以在具体的层面上还需要加入注解去声明事务,比如在dao层和service层加入@Transactional

自己:事务管理是存放到spring-context中的而不是存放到springMvc中的。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP