在典型的Spring MVC项目中,有两个“容器”:一个由ContextLoaderListener创建,另一个由DispatchServlet创建。
我想知道,这真的是两个IoC容器实例吗?(我看到了两个bean配置文件,一个是root-context.xml另一个servlet-context.xml)
root-context.xml
servlet-context.xml
如果有2个容器,那是什么关系?
在一个容器中声明的豆类可以在另一个容器中使用吗?
从spring官方网站:
该接口org.springframework.context.ApplicationContext 代表Spring IoC容器,并负责实例化,配置和组装上述bean。容器通过读取配置元数据来获取有关要实例化,配置和组装哪些对象的指令。配置元数据以XML,Java批注或Java代码表示。
org.springframework.context.ApplicationContext
再次来自官方文档:
在Web MVC框架中,每个DispatcherServlet都有自己的WebApplicationContext,它继承了在根WebApplicationContext中已经定义的所有bean。这些继承的bean可以在servlet特定的作用域中被覆盖,并且你可以在给定Servlet实例本地定义新的特定于作用域的bean。
现在来到你的问题,因为据称在这里:
在Spring Web Applications中,有两种类型的容器,每种容器的配置和初始化方式都不同。一个是“应用程序上下文”,另一个是“ Web应用程序上下文”。首先让我们谈谈“应用程序上下文”。应用程序上下文是由web.xml中定义的ContextLoaderListener或ContextLoaderServlet初始化的容器,其配置如下所示:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:*-context.xml</param-value> </context-param>
在上述配置中,我要求spring从类路径中加载与* -context.xml匹配的所有文件,并从中创建应用程序上下文。例如,此上下文可能包含组件,例如中间层事务服务,数据访问对象或你可能希望在整个应用程序中使用(和重用)的其他对象。每个应用程序将有一个应用程序上下文。
另一个上下文是“ WebApplicationContext”,它是应用程序上下文的子上下文。Spring Web应用程序中定义的每个DispatcherServlet将具有关联的WebApplicationContext。WebApplicationContext的初始化是这样的:
<servlet> <servlet-name>platform-services</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:platform-services-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
你提供spring配置文件的名称作为servlet初始化参数。这里要记住的重要一点是XML的名称必须采用-servlet的形式。xml。在此示例中,该servlet的名称为platform-services,因此我们XML的名称必须为platform-service-servlet.xml。可以从每个WebApplicationContext引用ApplicationContext中可用的任何bean。最好的做法是,在业务逻辑组件和数据访问类(通常在ApplicationContext中定义)等中间层服务与控制器和视图解析器(在Web应用程序中定义)等与Web相关的组件之间保持清晰的区分。每个Dispatcher Servlet的WebApplicationContext)。