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初始化的容器,配置如下所示:
Run Code Online (Sandbox Code Playgroud)<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匹配的所有文件,并从中创建一个Application Context.例如,此上下文可能包含组件,例如中间层事务服务,数据访问对象或您可能希望在整个应用程序中使用(和重用)的其他对象.每个应用程序将有一个应用程序上下文.
另一个上下文是"WebApplicationContext",它是应用程序上下文的子上下文.Spring Web应用程序中定义的每个DispatcherServlet都有一个关联的WebApplicationContext.WebApplicationContext的初始化发生如下:
Run Code Online (Sandbox Code Playgroud)<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相关组件(如控制器和视图解析器)(在每个Dispatcher Servlet的WebApplicationContext).
检查这些链接
Spring Framework中applicationContext.xml和spring-servlet.xml之间的区别
没有创建两个单独的容器.通常,您希望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.
归档时间: |
|
查看次数: |
21422 次 |
最近记录: |