为了更好的使用和理解应用上下文,通常用户应当对Spring的Resource
有所了解
应用上下文同时也是个资源加载器(ResourceLoader),能被用来加载多个Resource
。一个Resource
实质上可以当成一个java.net.URL
,可被用来从大多数位置以透明的方式获取底层的资源,包括从classpath、文件系统位置、任何以标准URL描述的位置以及其它一些变种。如果资源位置串是一个没有任何前缀的简单路径,这些资源来自何处取决于实际应用上下文的类型。
为了让bean能访问静态资源,可以象其它属性一样注入Resource。被注入的Resource
属性值可以是简单的路径字符串,ApplicationContext会使用已注册的PropertyEditor
,来将字符串转换为实际的Resource
对象。
ApplicationContext
构造器的路径就是实际的资源串,根据不同的上下文实现,字符串可视为不同的形式(例如:ClassPathXmlApplicationContext
会把路径字符串看作一个classpath路径)。然而,它也可以使用特定的前缀来强制地从classpath或URL加载bean定义文件,而不管实际的上下文类型。
3.8.5. ApplicationContext
在WEB应用中的实例化
与BeanFactory
通常以编程的方式被创建不同的是,ApplicationContext
能以声明的方式创建,如使用ContextLoader
。当然你也可以使用ApplicationContext
的实现之一来以编程的方式创建ApplicationContext
实例。首先,让我们先分析ContextLoader
接口及其实现。
ContextLoader
机制有两种方式,ContextLoaderListener
和ContextLoaderServlet
,他们功能相同但是listener不能在Servlet2.3容器下使用。Servlet2.4规范中servlet context listeners需要在web应用启动并能处理初始请求时立即运行。(servlet context listener关闭的时候也是相同的)。servlet context listener是初始化Spring ApplicationContext
理想的方式。你可能愿意选择ContextLoaderListener
,虽然是一样的,但决定权在于你。你可以查看ContextLoaderServlet
的Javadoc来获得更详细的信息。
可以象下面所示例的一样使用ContextLoaderListener
注册一个ApplicationContext
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- or use the ContextLoaderServlet instead of the above listener
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- or use the ContextLoaderServlet instead of the above listener
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-->
监听器首先检查contextConfigLocation
参数,如果它不存在,它将使用/WEB-INF/applicationContext.xml
作为默认值。如果已存在,它将使用分隔符(逗号、冒号或空格)将字符串分解成应用上下文件位置路径。可以支持ant-风格的路径模式,如/WEB-INF/*Context.xml
(WEB-INF文件夹下所有以"Context.xml"结尾的文件)。或者/WEB-INF/**/*Context.xml
(WEB-INF文件夹及子文件夹下的以"Context.xml"结尾的文件)。
ContextLoaderServlet
同ContextLoaderListener
一样使用'contextConfigLocation'
参数。