关于spring框架中的多个容器

lov*_*ing 40 spring dependency-injection spring-mvc inversion-of-control

在典型的Spring MVC项目中有两个"容器":一个由ContextLoaderListener创建,另一个由DispatchServlet创建.

我想知道,这些真的是两个IoC容器实例吗?(我看到两个bean配置文件,一个是root-context.xml另一个servlet-context.xml)

如果有2个容器,那么这种关系是什么?

在一个容器中声明的bean可以在另一个容器中使用吗?

bei*_*man 49

来自春季官方网站:

该接口org.springframework.context.ApplicationContext 代表Spring IoC容器,负责实例化,配置和组装上述bean.容器通过读取配置元数据获取有关要实例化,配置和组装的对象的指令.配置元数据以XML,Java注释或Java代码表示.

再次从官方Doc:

在Web MVC框架中,每个DispatcherServlet都有自己的WebApplicationContext,它继承了根WebApplicationContext中已定义的所有bean.可以在特定于servlet的作用域中重写这些继承的bean,并且可以为给定的Servlet实例定义新的作用域特定的bean.

现在来到你的问题,因为据称在这里:

在Spring Web Applications中,有两种类型的容器,每种容器都以不同方式配置和初始化.一个是"应用程序上下文",另一个是"Web应用程序上下文".让我们先谈谈"应用程序上下文".Application Context是由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>
Run Code Online (Sandbox Code Playgroud)

在上面的配置中,我要求spring从类路径加载与*-context.xml匹配的所有文件,并从中创建一个Application Context.例如,此上下文可能包含组件,例如中间层事务服务,数据访问对象或您可能希望在整个应用程序中使用(和重用)的其他对象.每个应用程序将有一个应用程序上下文.

另一个上下文是"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>
Run Code Online (Sandbox Code Playgroud)

您将spring配置文件的名称作为servlet初始化参数提供.这里要记住的重要一点是XML的名称必须是-servlet形式.XML.在此示例中,servlet的名称是platform-services,因此XML的名称必须是platform-service-servlet.xml.可以从每个WebApplicationContext引用ApplicationContext中可用的任何bean.最佳实践是在中间层服务(如业务逻辑组件和数据访问类(通常在ApplicationContext中定义))和Web相关组件(如控制器和视图解析器)(在每个Dispatcher Servlet的WebApplicationContext).

检查这些链接

Spring Framework中applicationContext.xml和spring-servlet.xml之间的区别

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-basics

  • 提醒一下,请正确引用并链接您复制的任何来源.我已经在上面做过,但请确保你将来这样做. (3认同)

Rau*_*wal 5

没有创建两个单独的容器.通常,您希望spring在需要对象时实例化servlet-context.xml中声明的对象.因此,您将servlet-context.xml配置文件映射到Dispatcher Servlet,即您希望在请求到达调度程序servlet时初始化该对象.

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)

其中,如果要在加载上下文时初始化对象并执行操作,则应在context-param部署描述符的标记中声明配置文件.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

您可以通过在servlet-context.xml和root-context.xml中声明单独的bean然后在自定义Context Loader Listener类中自动装配它们来编写测试.您会发现只初始化了根上下文实例,并且servlet-context bean为null.