这个问题老早就存在了,只是今天组长让我看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父子容器问题相关推荐

  1. boot spring test 文档_Spring、Spring Boot 和 TestNG 测试指南 ( 3 )

    原标题:Spring.Spring Boot 和 TestNG 测试指南 ( 3 ) 来源:chanjarster, github.com/chanjarster/spring-test-exampl ...

  2. boot spring 没有父子容器_Spring 系列(二):Spring MVC的父子容器

    1.背景 在使用Spring MVC时候大部分同学都会定义两个配置文件,一个是Spring的配置文件spring.xml,另一个是Spring MVC的配置文件spring-mvc.xml. 在这里给 ...

  3. Spring第24篇:父子容器详解

    主要的问题 1. 什么是父子容器? 2. 为什么需要用父子容器? 3. 父子容器如何使用? 下面我们就来探讨探讨. 我们先来看一个案例 系统中有2个模块:module1和module2,两个模块是独立 ...

  4. 【Spring(八)】父子容器

    Spring的容器具可以具有父子关系.具体含义就是:如果两个容器具有父子关系,那么在查找bean时,会先从子容器中查找,如果没有就查找父容器.但是父容器不能查找子容器的bean. 这个特性有什么意义? ...

  5. Spring Boot配置Tomcat容器、Jetty容器、Undertow容器

    Spring Boot配置Tomcat容器.Jetty容器.Undertow容器 Tomcat.Jetty.Undertow Tomcat概述 Jetty概述 Undertow概述 Spring Bo ...

  6. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现

    概述 我们知道 Spring Boot 能够创建独立的 Spring 应用,内部嵌入 Tomcat 容器(Jetty.Undertow),让我们的 jar 无需放入 Servlet 容器就能直接运行. ...

  7. spring容器_Spring容器文档阅读要点记录

    Spring容器文档阅读要点记录 相关的库代码位于 org.springframework.beans 和 org.springframework.context包下面 容器的基本的接口 基本接口:B ...

  8. Spring - 父容器与子容器

    一.Spring容器(父容器) 1.Mapper代理对象 2.Service对象 二.Springmvc(前端控制器)(子容器)        Controller对象 1.标准的配置是这样的:Con ...

  9. spring容器和SpringMVC容器的区别

    说起spring容器和SpringMVC容器,很多刚接触spring框架的同志都有点懵,甚至是一头雾水,分不清楚两者的关系和区别,包括本人也是,因此还在网上找个不少资料.这俩容器呢虽然有必然的联系,但 ...

最新文章

  1. R语言PCA主成分分析(Principle Component Analysis)实战2
  2. 如何从命令行重新加载.bash_profile?
  3. python中的time库安装步骤-python中time模块怎么用
  4. 剑指Spring源码(一)
  5. java 中的几种 通用方法“
  6. ProjectWise 工程内容管理及协同工作解决方案系列网络讲座
  7. 什么是.NET应用程序域
  8. PSVR透露下一步计划,不做内容改做声控
  9. JS常见的兼容性问题汇总
  10. 路面监控服务器怎么维修,路面监控服务器怎么维修
  11. aa44444444444
  12. vue-cli热更新 失效
  13. 利用AIDA64对电脑进行简单的稳定性测试的技巧分享
  14. Vue 计算属性和ref的使用方法
  15. C++实现rviz 2D Pose Estimate 功能设置机器人初始坐标
  16. Android的模拟器能不能照相,android模拟器无法使用camera拍照
  17. NLP--文本丶语义匹配方法概述详解
  18. tms320c6c语言代码微盘,TMS320C6
  19. vue用Three.js点精灵绘制森林
  20. ipv4和ipv6有什么区别

热门文章

  1. Python构建基于elkan优化算法的K-Means聚类模型
  2. R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
  3. DASI_1_IntroToData
  4. cli3解决 ie11语法错误 vue_vue-admin-template基于vue2的极简后台管理系统
  5. CRC校验和芯片ID
  6. 程序员接活利器,dataTable组件带你快速开发,摆脱CRUD
  7. 分类算法-支持向量机(SVM)
  8. 【pytorch】nn.GRU的使用
  9. Linux中的无人职守安装脚本kickstart
  10. sqlite java excel,Android将Excel表数据导入SQLite数据库