注意点1:
由BeanFactory 派生而来,提供了更多面向实际应用的功能。BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。
ApplicationContext的初始化很简单,如果配置文件放在类路径下,则可以优先使用ClassPathXmlApplicationContext实现类。
ApplicationContext ctx=
new ClassPathXmlApplicationContext("com/beans.xml");
对于ClassPathXmlApplicationContext来说,“com/beans.xml”等同于“classpath:com/beans.xml”。
如果配置文件放置在系统的路径下,则可以优先考虑使用FileSystemXmlApplicationContext实现类。
ApplicationContext ctx=
new FileSystemXmlApplicationContext("com/beans.xml");
对于FileSystemXmlApplicationContext来说,“com/beans.xml”等同于“file:D:/com/beans.xml”
注意点2:
区别classpath: 与 clsspath*: 前缀
假设有多个JAR包或文件系统类路径都拥有一个相同的包名(如:com.A)。“classpath:”只会在第一个加载的com.A 包下查找,而“classpath*:”会到扫描所有这些JAR包及类路径下出现的com.A类路径,他的查找范围更广。这对于分模块打包的应用非常有用,假设一个名为viewspace的应用共分3个模块,一个模块都对应一个配置文件,分别是module1.xml、module2.xml及modelue3.xml,他们都放在com.A 目录下,没一个模块单独打成 .jar包。使用“classpath*:com/A/module*.xml”可以成功加载到这3个模块的配置文件,而使用”classpath:com/A/module*.xml“ 时只会加载一个模块的配置文件。
Ant风格资源地址支持3中匹配符:
? : 匹配文件名中的一个字符,t?.xml 可以匹配test.xml , task.xml 等首字母为t开头的字符;
* : 匹配文件名中任意个的字符。
* * :匹配多层路径。
注意点3:
WebApplicationContext 初始化:
WebApplicationContext 的初始化方式和BeanFactory 、ApplicationContext的初始化方式有所区别,因为WebApplicationContext需要ServletContext实例,也就是说它必须在拥有Web容器的前提下才能完成启动的工作。在Web开发中,可以在web.xml 中配置自启动的Servlet或定义Web容器监听器(ServletContextListener),借助这两者中的任何一个,就可以完成Spring Web 应用上下文的工作。
org.srpingframework.web.context.ContextLoaderServlet。
org.srpingframework.web.context.ContextLoaderListener。
两者的内部都实现了启动WebApplicationContext实例的逻辑,用户只要根据Web容器的具体情况选择两者之一,并在web.xml完成配置就可以了。
...
<!-- 指定配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans-dao.xml , /WEB-INF/beans-service.xml</param-value>
</context-param>
<!-- 声明Web容器监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
...
ContextLoaderlister通过Web容器上下文参数contextConfigLocation获取Spring配置文件的位置。用户可以指定多个配置文件,用逗号、空格 或 分号分隔均可。
在不支持容器监听器的低版本Web容器中,可以采用ContextLoadServlet来完成相同的工作,如下:实现自启动Servlet:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans-dao.xml , /WEB-INF/beans-service.xml</param-value>
</context-param>
...
<!-- 声明自启动的Servlet -->
<servlet>
<servlet-name>springContextLoaderServlet</servlet-name>
<servlet-class>springContgframework.web.context.ContextLoaderServlet</servlet-class>
<!-- 启动顺序 -->
<load-on-startup>**1**</load-on-startup>
</servlet>
由于WebApplicationContext需要使用日志功能,用户可以将Log4J的配置文件放置到类路径WEB-INF/classes下,这时Log4J引擎既可以顺利启动。如果Log4J配置文件放在其他位置,还必须在web.xml 中指定Log4J的配置文件位置。Spring为启动 Log4J 引擎提供了两个类似于启动WebApplicationContext的实现类:Log4jConfigServlet 和 Log4jConfigListener,不管采用哪中方式,都必须保证能够在装载Spring配置文件前先装载Log4J配置信息。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans-dao.xml , /WEB-INF/beans-service.xml</param-value>
</context-param>
<!-- 指定Log4J配置文件位置 -->
<context-param>
<param-name>log4jConfigLocation</pagram-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<!-- 装载Log4J配置文件的自启动Servlet -->
<servlet>
<servlet-name>log4jConfigServlet</servlet-name>
<servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>
<load-on-startup>**1**</load-on-startup>
</servlet>
<servlet>
<servlet-name>springContextLoaderServlet</servlet-name>
<servlet-class>springContgframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>**2**</load-on-startup>
</servlet>
注意启动顺序,如果使用Web监听器,则必须将Log4jConfigListener放置在ContextLoaderListener的前面。采用以上的配置方式,Spring将自动使用XmlWebApplicationContext启动Spring容器,即通过XML文件为Spring容器提供Bean的配置信息。
必须保证Log4J 配置再Spring前配置这样日志才有意义。自定义的可以再Spring之后实现