boot spring 没有父子容器_Spring父子容器问题
这个问题老早就存在了,只是今天组长让我看AOP不生效的时候,才真实遇到这个问题,之前都是用的Spring Boot开发,不会存在这个问题。
问题描述
如果使用传统的方式来开发Spring项目,要部署在Tomcat上面,一般会依赖Spring与Spring MVC,在Tomcat的web.xml中会配置一个加载service的配置文件,这个在Tomcat启动的时候会进行加载,会生成一个Spring的容器。
默认情况下,Tomcat会在资源目录下加载配置servlet名称的另外一个xml配置文件,比如servlet名称为test,那么会加载test-servlet.xml配置文件,如果使用Spring MVC的话,会解析这个配置文件并且再生成一个Spring的容器,同时设置Tomcat启动时创建的那个容器为父容器。
image-20190329172613784
容器分离的影响:
一般在父容器中会加载service,dao之类的东西,不加载controller
在mvc容器中只加载controller
两个容器负责不同的bean,但是如果在父容器中配置了一些AOP想要处理controller的内容,因为容器的隔离,AOP就不会生效。
因为在解析bean的时候,它会获取BeanPostProcesser(BPP),不同容器获取的BPP也是不相同的,理所当然在子容器解析Controller的bean时候,获取不到父容器配置的BPP,也就无法生成代理对象。
解决方案
如果明白为什么会出现父子容器问题,那么可以想到如下方案
如果只需要处理service的bean,那么只在父容器的配置文件中操作
如果只处理controller的bean,那么在mvc的配置文件中修改
如果同时要处理service,还要处理controller,那么在两个配置文件中都进行修改
个人觉得,根据自己的业务处理,尝试重新ApplicationContext的getBeanFactory方法,交给其父容器获得,如果父容器为空,再由自己处理,参考Classloader的双亲委派机制,当然这只是我的一种设想。
@Override
public final ConfigurableListableBeanFactory getBeanFactory() {
if(getParent() != null){
getParent().getBeanFactory();
}
synchronized (this.beanFactoryMonitor) {
if (this.beanFactory == null) {
throw new IllegalStateException("BeanFactory not initialized or already closed - " +
"call 'refresh' before accessing beans via the ApplicationContext");
}
return this.beanFactory;
}
}
最后
记录
boot spring 没有父子容器_Spring父子容器问题相关推荐
- boot spring test 文档_Spring、Spring Boot 和 TestNG 测试指南 ( 3 )
原标题:Spring.Spring Boot 和 TestNG 测试指南 ( 3 ) 来源:chanjarster, github.com/chanjarster/spring-test-exampl ...
- boot spring 没有父子容器_Spring 系列(二):Spring MVC的父子容器
1.背景 在使用Spring MVC时候大部分同学都会定义两个配置文件,一个是Spring的配置文件spring.xml,另一个是Spring MVC的配置文件spring-mvc.xml. 在这里给 ...
- Spring第24篇:父子容器详解
主要的问题 1. 什么是父子容器? 2. 为什么需要用父子容器? 3. 父子容器如何使用? 下面我们就来探讨探讨. 我们先来看一个案例 系统中有2个模块:module1和module2,两个模块是独立 ...
- 【Spring(八)】父子容器
Spring的容器具可以具有父子关系.具体含义就是:如果两个容器具有父子关系,那么在查找bean时,会先从子容器中查找,如果没有就查找父容器.但是父容器不能查找子容器的bean. 这个特性有什么意义? ...
- Spring Boot配置Tomcat容器、Jetty容器、Undertow容器
Spring Boot配置Tomcat容器.Jetty容器.Undertow容器 Tomcat.Jetty.Undertow Tomcat概述 Jetty概述 Undertow概述 Spring Bo ...
- 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现
概述 我们知道 Spring Boot 能够创建独立的 Spring 应用,内部嵌入 Tomcat 容器(Jetty.Undertow),让我们的 jar 无需放入 Servlet 容器就能直接运行. ...
- spring容器_Spring容器文档阅读要点记录
Spring容器文档阅读要点记录 相关的库代码位于 org.springframework.beans 和 org.springframework.context包下面 容器的基本的接口 基本接口:B ...
- Spring - 父容器与子容器
一.Spring容器(父容器) 1.Mapper代理对象 2.Service对象 二.Springmvc(前端控制器)(子容器) Controller对象 1.标准的配置是这样的:Con ...
- spring容器和SpringMVC容器的区别
说起spring容器和SpringMVC容器,很多刚接触spring框架的同志都有点懵,甚至是一头雾水,分不清楚两者的关系和区别,包括本人也是,因此还在网上找个不少资料.这俩容器呢虽然有必然的联系,但 ...
最新文章
- R语言PCA主成分分析(Principle Component Analysis)实战2
- 如何从命令行重新加载.bash_profile?
- python中的time库安装步骤-python中time模块怎么用
- 剑指Spring源码(一)
- java 中的几种 通用方法“
- ProjectWise 工程内容管理及协同工作解决方案系列网络讲座
- 什么是.NET应用程序域
- PSVR透露下一步计划,不做内容改做声控
- JS常见的兼容性问题汇总
- 路面监控服务器怎么维修,路面监控服务器怎么维修
- aa44444444444
- vue-cli热更新 失效
- 利用AIDA64对电脑进行简单的稳定性测试的技巧分享
- Vue 计算属性和ref的使用方法
- C++实现rviz 2D Pose Estimate 功能设置机器人初始坐标
- Android的模拟器能不能照相,android模拟器无法使用camera拍照
- NLP--文本丶语义匹配方法概述详解
- tms320c6c语言代码微盘,TMS320C6
- vue用Three.js点精灵绘制森林
- ipv4和ipv6有什么区别
热门文章
- Python构建基于elkan优化算法的K-Means聚类模型
- R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
- DASI_1_IntroToData
- cli3解决 ie11语法错误 vue_vue-admin-template基于vue2的极简后台管理系统
- CRC校验和芯片ID
- 程序员接活利器,dataTable组件带你快速开发,摆脱CRUD
- 分类算法-支持向量机(SVM)
- 【pytorch】nn.GRU的使用
- Linux中的无人职守安装脚本kickstart
- sqlite java excel,Android将Excel表数据导入SQLite数据库