Spring:需要contextConfigLocation吗?

时间:2015-04-08 11:41:45

标签: java spring spring-mvc java-ee

web.xml中,我们有一个名为contextConfigLocation的上下文参数集,其定义如下代码所示:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/root-context.xml</param-value>
</context-param>

同样的参数在Dispatch Servlet中设置,如下所示

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

这两个contextConfigLocation之间有什么区别?

3 个答案:

答案 0 :(得分:2)

    当我们开始我们的时,
  • context-param中的contextConfigLocation获取Loaded Web容器或服务器
  • 它通常有DAOImpl,Service,Singleton,Datasource 辅助对象等,那些对象我们希望事先做好准备,以便可以使用

  • init-param中的contextConfigLocation特定于DispatcherServlet Only,并且一旦Servlet启动就会被加载,这可能是Lazily加载的,即在第一次调用Servlet时,如果load-on-startup不是该servlet的正值。
  • 这意味着,此处定义的Bean可能会在以后创建。它通常包含控制器豆等

  • 在context-param中定义的Bean ContextXml对Beans定义是可见的 在init-param ContextXml
  • 但是init-param中定义的Bean对于context-param是不可见的 context Beans
  • 所以@Controller Bean通常在ChildApplicationContext中定义,而@Service是RootApplicationContext的一部分
  • 这意味着@Controller无法注入@Service 虽然我们很容易在@Controller
  • 中轻松注入@Service Bean

  

所以基本上我们通过控制Beans的可见性(不是范围)   不同的context-config文件

答案 1 :(得分:1)

第一个设置适用于全局,而第二个设置是私有的,并且是“spring”servlet独有的。

答案 2 :(得分:1)

有两种类型的上下文:

Root context(Super)

拥有(子)servlet上下文(Sub)

作为通用应用程序上下文,Web应用程序上下文是分层的。每个应用程序都有一个根上下文,而应用程序中的每个servlet(包括MVC框架中的调度程序servlet)都有自己的子上下文。