类结构图:
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver
定义
ApplicationContext:提供了应用程序上下文信息。程序运行时是只读的,但可以被重新加载(如果支持的话)。
context包的核心是ApplicationContext
接口。它由BeanFactory
接口派生而来,因而提供了BeanFactory
所有的功能。为了以一种更面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext
提供了以下的功能:
- 提供对BeanFactory分层的支撑,所谓分层也就是parentBeanFactory概念。继承了HierarchicalBeanFactory接口
- 枚举所有的bean实例,应用组件访问bean工厂方法。继承自
ListableBeanFactory
。 - 能够用一个通用的方式(如application*.xml)加载文件资源。继承了
ResourceLoader
接口的子接口ResourcePatternResolver。 - 对事件的支持。继承了
ApplicationEventPublisher
接口。 - 国际化支持。继承了
MessageSource
接口。ApplicationContext包括BeanFactory的全部功能,因此建议优先使用ApplicationContext。除非对于某些内存非常关键的应用,才考虑使用 BeanFactory。
获取方式
很多时候, ApplicationContext 允许以声明式方式操作容器,无须手动创建。可利用如 ContextLoader 的支持类,在 Web 应用启动时自动创建 ApplicationContext。当然,也可以采用编程方式创建 ApplicationContext。
声明式:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml</param-value> </context-param>
编程式:
spring为ApplicationContext提供的3种实现:
ClassPathXmlApplicationContext FileSystemXmlApplicationContext XmlWebApplicationContext(为web应用订制)
1、ClassPathXmlApplicationContext
//eg1.加载单个配置 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); //eg2.加载多个配置 String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"}; ApplicationContext ctx2 = new ClassPathXmlApplicationContext(locations);
2、FileSystemXmlApplicationContext
//eg1.加载单个配置文件(通过文件系统从相对于当前工作目录中载入) ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml"); //eg2.加载多个配置文件(通过文件系统从相对于当前工作目录中载入) String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"}; ApplicationContext ctx2 = new FileSystemXmlApplicationContext(locations ); //eg3. 加载单个配置文件(根据具体路径加载文件) ApplicationContext ctx3 =new FileSystemXmlApplicationContext("D:/project/bean.xml");
3、XmlWebApplicationContext
ServletContext servletContext = request.getSession().getServletContext(); ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
总结:
- 前两个类适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。 3适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。
- 1、2在获取失败时抛出异常,第三种方式返回null。
- new ClassPathXmlApplicationContext("applicationContext.xml") ; 就是给所有的工厂管理BEAN分配内存。 在web应用中如果上边代码不是单例或者使用该段代码的类不
是单例 那就不停的给所配置BEAN分配内存,而如果HIBERNATE的SessionFactory也交由SPRING 管理 那么ENTITY就更加耗费内存了。解决办法就是使用单例模式。