bean 是 Spring 框架的一个核心概念,它是构成应用程序的主干,并且是由 Spring IoC 容器负责实例化、配置、组装和管理的对象。
通俗来讲:
Spring 框架中,BeanFactory 接口是 Spring IoC容器 的实际代表者。
从下面的接口继承关系图中可以看出,ApplicationContext 接口继承了 BeanFactory 接口,并通过继承其他接口进一步扩展了基本容器的功能。

因此,org.springframework.context.ApplicationContext接口也代表了 IoC容器 ,它负责实例化、定位、配置应用程序中的对象(bean)及建立这些对象间(beans)的依赖。
IoC容器通过读取配置元数据来获取对象的实例化、配置和组装的描述信息。配置的零元数据可以用xml、Java注解或Java代码来表示。
实现思路:
主要看一下ContextLoaderListener,DispatcherServlet在之前分析Thymeleaf的SSTI的时候就做了相关的分析
下面是一个典型 Spring 应用的 web.xml 配置示例:
"<a href=" http:="" www.w3.org="" 2001="" XMLSchema-instance"="" rel="nofollow">http://www.w3.org/2001/XMLSchema-instance" - xmlns="http://java.sun.com/xml/ns/javaee"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
-
-
HelloSpringMVC -
-
-
contextConfigLocation -
/WEB-INF/applicationContext.xml -
-
-
-
org.springframework.web.context.ContextLoaderListener -
-
-
-
dispatcherServlet -
org.springframework.web.servlet.DispatcherServlet -
-
contextConfigLocation -
/WEB-INF/dispatcherServlet-servlet.xml -
-
1 -
-
-
-
dispatcherServlet -
/ -
关于 Root Context 和 Child Context 的重要概念:
Context,其中只有一个 Root Context,剩下的全是 Child ContextChild Context都可以访问在 Root Context中定义的 bean,但是Root Context无法访问Child Context中定义的 beanContext在创建后,都会被作为一个属性添加到了 ServletContext中ContextLoaderListener 主要被用来初始化全局唯一的Root Context,即 Root WebApplicationContext。这个 Root WebApplicationContext 会和其他 Child Context 实例共享它的 IoC 容器,供其他 Child Context 获取并使用容器中的 bean。
回到 web.xml 中,其相关配置如下:
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext.xml</param-value>
- </context-param>
-
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
依照规范,当没有显式配置 ContextLoaderListener 的 contextConfigLocation 时,程序会自动寻找 /WEB-INF/applicationContext.xml,作为配置文件,所以其实上面的 标签对其实完全可以去掉。
DispatcherServlet 初始化完成后,会创建一个普通的 Child Context 实例。
每个具体的 DispatcherServlet 创建的是一个 Child Context,代表一个独立的 IoC 容器;而 ContextLoaderListener 所创建的是一个 Root Context,代表全局唯一的一个公共 IoC 容器。
果要访问和操作 bean ,一般要获得当前代码执行环境的IoC 容器 代表者 ApplicationContext。
所有的Context在创建后,都会被作为一个属性添加到了 ServletContext中
LandGrey师傅文中给出了4种获取当前上下文的思路
第一种:getCurrentWebApplicationContext()
- // getCurrentWebApplicationContext方法获得的是一个XmlWebApplicationContext实例类型的Root WebApplicationContext。
- WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
第二种:WebApplicationContextUtils
- // 通过这种方法获得的也是一个 Root WebApplicationContext 。此方法看起来比较麻烦
- WebApplicationContext context =