春节假期课程将暂停更新一次,下次更新定为 2020 年 2 月 6 日,极客时间祝你新春快乐
课件和 Demo 地址
https://github.com/geektime-geekbang/geekbang-lessons
作者回复: 1.基本都是单一查找,依赖查找可以在LB这种场景应用,但这个分层查找有啥用?
比如 Spring MVC 中,Biz 组件放在 Root ApplicationContext,而 Web 组件放在 DispatcherServlet 的 ApplicationContext,后者是前者的子 ApplicationContext,所以,子 ApplicationContext 可以读取父 ApplicationContext
作者回复: 容器的层次关系主要的目的是实现 Bean 复用,假设一个应用存在一个 Root ApplicationContext,内部的 Bean 来自于一个 jar 包,那么,这个jar 包可能被两个不同的 Servlet 应用使用,这时,ServletContext A 和 ServletContext B 同时复用了这个 parent ApplicationContext,而它自己也有 ApplicationContext,这也是 Spring Web MVC 所涉及的应用上下文架构。
作者回复: BeanFactory 的双亲委派和 ClassLoader 类似,和 Bean 冲突没有直接关系。 BeanFactoryUtils#beansOfTypeIncludingAncestors 仍旧是递归地查找指定类型的 Bean 集合,并且是在所有层次类查找,只不过该方法会排除子 BeanFactory 已存在的 Bean,这是一种就近原则的设计。
作者回复: 在 Spring Framework(包括 SpringMVC) 确实是两个应用上下文,当初的设计主要是为了复用,Root ApplicationContext 使用 Biz 组件,而 DispatcherServlet 关联的 ApplicationContext 则是管理 Web 组件。不过在 Spring Boot 场景下,收敛到同一个 ApplicationContext 中了
作者回复: 是的,会派出,这个和 ClassLoader 类似