Spring:ApplicationContext注意点

本文详细介绍了Spring框架中的两种核心IoC容器——BeanFactory和ApplicationContext的特点与使用方法,对比了它们之间的区别,并深入探讨了ApplicationContext在不同场景下的配置与初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意点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之后实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值