Spring BeanFactory和ApplicationContext

BeanFactory和ApplicationContext均可以用一bean的加载、实例化和维护,BeanFactorty接口提供了配置框架及基本功能,可是没法支持spring的aop功能和web应用。ApplicationContext接口做为BeanFactory的派生,于是提供BeanFactory全部的功能。并且ApplicationContext还在功能上作了扩展,相较于BeanFactorty,ApplicationContext还提供了如下的功能:web

(1)MessageSource, 提供国际化的消息访问
(2)资源访问,如URL和文件
(3)事件传播特性,即支持aop特性
(4)载入多个(有继承关系)上下文 ,使得每个上下文都专一于一个特定的层次,好比应用的web层 spring

3. 经常使用的获取ApplicationContext的方法:
FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件建立,参数为配置文件名或文件名数组
ClassPathXmlApplicationContext:从classpath的xml配置文件建立,能够从jar包中读取配置文件编程

WebApplicationContextUtils:从web应用的根目录读取配置文件,须要先在web.xml中配置,能够配置监听器或者servlet来实现数组


如下经过声明方式,便可使用ApplicationContext应用上下文加载bean,若是web.xml中不加以下监听器也能够,只不过默认使用了BeanFactory做为bean工厂bash

Bean工厂加载bean以后不会立刻实例化,在bean第一次使用时才真正实例化,且实例化的bean都是单例的,而经过应用上下文加载的单例bean在加载的时候会当即初始化app

复制代码
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>复制代码
复制代码


这两种方式都默认配置文件为web-inf/applicationContext.xml,也可以使用context-param指定配置文件框架

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>复制代码


3、两者区别url

1.BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,咱们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性建立了全部的Bean。这样,在容器启动时,咱们就能够发现Spring中存在的配置错误。 相对于基本的BeanFactory,ApplicationContext 惟一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。spa

BeanFacotry延迟加载,若是Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;因此一般状况下咱们选择使用 ApplicationContext。
应用上下文则会在上下文启动后预载入全部的单实例Bean。经过预载入单实例bean ,确保当你须要的时候,你就不用等待,由于它们已经建立好了。code

2.BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但二者之间的区别是:BeanFactory须要手动注册,而ApplicationContext则是自动注册。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。并且 beanFactory 的许多功能须要经过编程实现而 Applicationcontext 能够经过配置实现。好比后处理 bean , Applicationcontext 直接配置在配置文件便可而 beanFactory 这要在代码中显示的写出来才能够被容器识别。 )

3.beanFactory主要是面对与 spring 框架的基础设施,面对 spring 本身。而 Applicationcontex 主要面对与 spring 使用的开发者。基本都会使用 Applicationcontex 并不是 beanFactory 。

4、总结

做用:
1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。

2. ApplicationContext除了提供上述BeanFactory所能提供的功能以外,还提供了更完整的框架功能:
a. 国际化支持
b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
c. 事件传递:经过实现ApplicationContextAware接口

3. 经常使用的获取ApplicationContext

FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件建立,参数为配置文件名或文件名数组,有相对路径与绝对路径。

ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext factory=new FileSystemXmlApplicationContext("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");复制代码

ClassPathXmlApplicationContext:从classpath的xml配置文件建立,能够从jar包中读取配置文件。ClassPathXmlApplicationContext 编译路径总有三种方式:

ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
ApplicationContext factory = new ClassPathXmlApplicationContext("file:E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");复制代码

XmlWebApplicationContext:从web应用的根目录读取配置文件,须要先在web.xml中配置,能够配置监听器或者servlet来实现

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>复制代码

<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>复制代码

这两种方式都默认配置文件为web-inf/applicationContext.xml,也可以使用context-param指定配置文件

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>复制代码
相关文章
相关标签/搜索