访问规则:子容器可以访问父容器的对象,父容器不能访问子容器的对象
1.ContextLoaderListener会被优先初始化时,其会根据元素中contextConfigLocation参数指定的配置文件路径,在这里就是"/WEB-INF/spring/applicationContext.xml”,来创建WebApplicationContext实例。 并调用ServletContext的setAttribute方法,将其设置到ServletContext中,属性的key为”org.springframework.web.context.WebApplicationContext.ROOT”,最后的”ROOT"字样表明这是一个 Root WebApplicationContext。
2.DispatcherServlet在初始化时,会根据元素中contextConfigLocation参数指定的配置文件路径,即"/WEB-INF/spring/spring-servlet.xml”,来创建Servlet WebApplicationContext。同时,其会调用ServletContext的getAttribute方法来判断是否存在Root WebApplicationContext。如果存在,则将其设置为自己的parent。这就是父子上下文(父子容器)的概念。

为什么需要父子容器?
父子容器的主要作用应该是划分框架边界。有点单一职责的味道。在J2EE三层架构中,在service层我们一般使用spring框架来管理, 而在web层则有多种选择,如spring mvc、struts等。因此,通常对于web层我们会使用单独的配置文件。例如在上面的案例中,一开始我们使用spring-servlet.xml来配置web层,使用applicationContext.xml来配置service、dao层。如果现在我们想把web层从spring mvc替换成struts,那么只需要将spring-servlet.xml替换成Struts的配置文件struts.xml即可,而applicationContext.xml不需要改变。

是否可以把所有类都通过Spring父容器来管理?
Spring的applicationContext.xml中配置全局扫描,所有的类都通过父容器来管理的配置就是如下:
然后在SpringMvc的配置里面不配置扫描包路径。很显然这种方式是行不通的,这样会导致我们请求接口的时候产生404。因为在解析@ReqestMapping注解的过程中initHandlerMethods()函数只是对Spring MVC 容器中的bean进行处理的,并没有去查找父容器的bean, 因此不会对父容器中含有@RequestMapping注解的函数进行处理,更不会生成相应的handler。所以当请求过来时找不到处理的handler,导致404。

是否可以把我们所需的类都放入Spring-mvc子容器里面来管理(springmvc的spring-servlet.xml中配置全局扫描)
这个是把包的扫描配置spring-servlet.xml中这个是可行的。为什么可行因为无非就是把所有的东西全部交给子容器来管理了,子容器执行了refresh方法,把在它的配置文件里面的东西全部加载管理起来来了。虽然可以这么做不过一般应该是不推荐这么去做的,一般人也不会这么干的。如果你的项目里有用到事物、或者aop记得也需要把这部分配置需要放到Spring-mvc子容器的配置文件来,不然一部分内容在子容器和一部分内容在父容器,可能就会导致你的事物或者AOP不生效。(这里不就有个经典的八股文吗?你有遇到事物不起作用的时候,其实这也是一种情况)

同时通过两个容器同时来管理所有的类?
会造成内存的浪费

父子容器造成的事务失效问题:
比如父容器在service层配置了事务注解,子容器controller在注册的时候就会从父容器拿到事务增强的service方法;但如果子容器中也扫描了service方法,那么controller注入的时候子容器中没有被事务增强的service方法就会被注入到controller方法中,导致事务失效。

SpringBoot中已经没有父子容器了

Spring父子容器详解!!!!相关推荐

  1. Spring系列:父子容器详解

    又一次被面试官带到坑里面了. 面试官:springmvc用过么? 我:用过啊,经常用呢 面试官:springmvc中为什么需要用父子容器? 我:嗯...没听明白你说的什么. 面试官:就是control ...

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

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

  3. Spring —— IoC 容器详解

    引言 本篇博客总结自官网的<The IoC Container>,其中会结合王富强老师的<Spring揭秘>融入自己的语言和理解,争取通过这一篇文章彻底扫除spring IOC ...

  4. Spring父子容器

    目录 什么是父子容器 什么是容器 如何形成父子关系 父子容器的特点 父子容器的作用 引用 什么是父子容器 什么是容器 当我们使用spring的时候,我们经常会提到一个概念,IOC容器,IOC容器就是具 ...

  5. Spring循环依赖详解

    Spring循环依赖详解 什么是循环依赖 spring是如何解决循环依赖 循环源码分析 getSingletion方法 getSingleton spring开启代理对象的地方 循环依赖的限制条件 什 ...

  6. Spring Boot 配置文件详解

    2019独角兽企业重金招聘Python工程师标准>>> 第二篇 : Spring Boot配置文件详解 文章首发于微信公众号<程序员果果> 地址:https://mp.w ...

  7. spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解

    spring jar 包详解 spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环 ...

  8. Spring的lazy-init详解

    Spring中lazy-init详解 ApplicationContext实现的默认行为就是在启动服务器时将所有singleton bean提前进行实例化 (也就是依赖注入).提前实例化意味着作为初始 ...

  9. Spring事务管理详解_基本原理_事务管理方式

    Spring事务管理详解_基本原理_事务管理方式 1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象 ...

最新文章

  1. 将页面元素置为不可修改Readonly,所有元素统一修改,统一调用
  2. 智源发布:2021 年十大人工智能技术趋势【附下载链接】
  3. Java程序员从笨鸟到菜鸟之(一百零六)java操作office和pdf文件(四)页面列表导出cvs,excel、pdf报表.
  4. 零基础如何学Java?能学会Java吗?
  5. uwp应用在debug模式下运行正常,编译为release版本的时候抛出异常
  6. 【LOJ#6682】梦中的数论(min_25筛)
  7. Ubuntu设置为命令行登录
  8. Linux:多进程、多线程服务器的实现解析(有图有代码有真相!!!)
  9. html一行中怎么写空格,html – 用一行填写空格
  10. 计算机文化基础第二章,计算机文化基础(第二章Windows2000操作系统)
  11. 市场营销读后感_好书共赏市场营销原理——带你探索市场营销成功的奥秘 !...
  12. ubuntu ifconfig_VirtualBox中ubuntu的LAMP项目(温度采集)
  13. 如何站在巨人的肩膀上学习
  14. lack名词形式_lack是什么意思_lack在线翻译_英语_读音_用法_例句_海词词典
  15. 美团外卖推荐系统之智能流量分发的实践与探索
  16. 从零开始学习UCOSII操作系统2--UCOSII的内核实现
  17. SpringFramework教程
  18. 施罗德: 以大数据技术洞悉投资先机,同时管理风险
  19. 四维图新总经理孙玉国谈导航
  20. 计算机系统基础 - Lab1

热门文章

  1. esp8266 mixly blynk远程控制 + NTP+天气预报及一体 智能钟
  2. 华为软件迁移实践微认证题库
  3. JavaWEB(项目分析用户登录发布新闻)
  4. Unity新手引导(圆形指引、矩形指引)
  5. 微信公众平台开发之数据传输过程
  6. PHP统计总访问量和访客数
  7. Windows共享上网的详细设置
  8. mysql的时区_MySQL时区支持
  9. 2021上海高考成绩几点查询,2021年上海高考分数公布时间几点,具体时间什么时候可以查询...
  10. HEVC中级别(Level)计算