Spring和springmvc父子容器注解扫描问题详解
2017-07-25 15:32
387 查看
在springmvc中,我们经常配置两个xml,一个spring专属,一个springMVC专属,在这两个xml中我们都可以配置bean的自动扫描。
一般我们在spring.xml中不扫描@Controller注解,在springmvc.xml中不扫描@service和@Repository
为什么要这么做呢?
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.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>
为什么要这么做呢?
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和springmvc父子容器注解扫描问题详解
- Spring和springmvc父子容器注解扫描问题详解
- spring和springmvc父子容器问题
- Spring 与 SpringMVC 父子容器问题
- 关于Spring大容器和SpringMVC小容器中注解扫描冲突(影响事物回滚)的解决
- 非J2EE 容器环境下Spring +JPA 多持久化单元/多个JAR归档注解实体 的实体扫描问题及解决办法
- Spring以及SPringmvc相关问题: ServletContext -父子容器
- Spring和SpringMVC父子容器关系初窥
- spring和springMVC父子容器的原理
- Spring启动时注解扫描的问题
- 关于Spring和SpringMVC父子容器
- spring的启动过程——spring和springMVC父子容器的原理
- Spring学习笔记——关于Spring注解扫描不能注入new对象问题
- spring与springMVC配置扫描的问题
- Spring 和SpringMVC 的父子容器关系
- Spring和SpringMVC父子容器关系初窥
- spring的父子容器及配置详解
- spring和springmvc父子容器的理解
- Spring和SpringMVC父子容器关系初窥
- Spring、SpringMVC父子容器关系浅析