首页 > 代码库 > BeanFactory和ApplicationContext的介绍

BeanFactory和ApplicationContext的介绍

------------------siwuxie095

   

   

   

   

   

   

   

Spring 通过一个配置文件描述 Bean 和 Bean 之间的依赖关系,

利用 Java 语言的反射功能实例化 Bean,并建立 Bean 之间的

依赖关系

   

Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了

Bean 实例缓存、生命周期管理、Bean 实例代理、事件发布

资源装载 等高级服务

   

   

   

BeanFactory 是 Spring 框架最核心的接口,它提供了高级 IoC 的

配置机制,BeanFactory 使管理不同类型的 Java 对象成为可能

   

ApplicationContext 建立在 BeanFactory 基础之上,提供了更多面向应用

的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用

   

一般称 BeanFactory IoC 容器,而称 ApplicationContext 应用上下文

   

   

二者的区分:

   

BeanFactory Spring 框架的基础设施,面向 Spring 本身

   

ApplciationContext 面向使用 Spring 框架的开发者,几乎所有的应用

场合都直接使用 ApplicationContext,而非底层的 BeanFactory

   

   

   

   

BeanFactory 的介绍

   

   

BeanFactory 是一个类工厂,但和传统的类工厂不同,传统的类工厂

仅负责构造一个 或几个类的实例,而 BeanFactory 是类的通用工厂,

它可以创建并管理各种类的对象

   

这些可被创建和管理的对象本身没有什么特别之处,它们仅仅是一个

POJO,Spring 称这些被创建和管理的 Java 对象为 Bean

   

Spring 中,Java 对象的范围更加宽泛

   

   

   

BeanFactory 接口位于类结构树的顶端,它最主要的方法就是

getBean(String beanName),该方法从容器中返回特定名称

Bean,BeanFactory 的功能通过其他接口得到不断扩展 

   

   

BeanFactory 的类体系结构:

   

1)XmlBeanFactory

   

Spring BeanFactory 提供了多种实现类,最常用的是 XmlBeanFactory

   

   

2)ListableBeanFactory

   

该接口定义了访问容器中 Bean 基本信息的若干方法,如:查看 Bean 的个数,

获取某一类型 Bean 的配置名,或 查看容器中是否包含某一 Bean …

   

   

3)HierarhicalBeanFactory

   

父子级联 IoC 容器的接口,子容器可以通过接口方法访问父容器

   

   

4)ConfigurableBeanFactory

   

该接口增强了 IoC 容器的可定制性,它定义了设置类装载器、属性

编辑器、容器初始化后置处理器等方法

   

   

5)AutowireCapableBeanFactory

   

定义了将容器中的 Bean 按某种规则(如:按名称匹配、按类型匹配)

进行自动装配的方法

   

   

6)SingletonBeanFactory

   

定义了允许在运行期间向容器注册单实例 Bean 的方法

   

   

7)BeanDefinitionRegistry

   

Spring 配置文件中每一个 Bean 节点元素在 Spring 容器里都通过一个

BeanDefinition 对象表示,它描述了 Bean 的配置信息

   

BeanDefinitionResgistry 接口提供了向容器手工注册 BeanDefinition

对象的方法

   

   

   

   

BeanFactory 的初始化顺序:

   

1)创建配置文件

2)装载配置文件

3)启动 IoC 容器

4)获取 Bean 实例

   

   

通过 BeanFactory 启动 IoC 容器时,并不会初始化配置文件

中定义的 Bean,初始化动作发生在第一个调用的时候

   

对于单实例的 Bean 来说,BeanFactory 会缓存 Bean 实例,

所以第二次使用 getBean() 方法时就可以直接从 IoC 容器的

缓存中获取 Bean 实例 

   

   

另外,在初始化 BeanFactory 时必须为其提供一种日志框架,

一般使用 Log4J,即在类路径下提供 Log4J 的配置文件,这

样,启动 Spring 容器时才不会报错

   

   

   

   

ApplicationContext 的介绍

   

   

如果说 BeanFactory Spring 的心脏,那么 ApplicationContext

就是完整的身躯

   

ApplicationContext 由BeanFactory派生而来,提供了很多实际应用

的功能。在 BeanFactory 中,很多功能需要以编程的方式实现,而在

ApplicationContext 中则可以通过配置的方式实现

   

   

   

ApplicationContext 的具体实现类:

   

1)ClassPathXmlApplicationContext

   

从类路径中加载配置文件

   

   

2)FileSystemXmlApplicationContext

   

从文件系统中加载配置文件

   

   

3)ConfigurableApplicationContext

   

扩展自 ApplicationContext,新增了两个主要方法 reflesh()

close()。这让 ApplicationContext 具有启动、刷新和关闭应用

上下文的能力

   

在应用上下文关闭的情况下调用 reflesh() 即可启动应用上下文,

在已经启动的状态下调用 reflesh() 即可清除缓存并且重新装载

配置信息,调用 close() 方法则可以关闭应用上下文

   

   

   

ApplicationContext 通过许多其他接口扩展了 BeanFactory 的功能

   

ApplicationContext 的扩展接口:

   

1)ApplicationEventPublisher

   

它让容器拥有发布应用上下文事件的功能,包括容器启动事件、

关闭事件等

   

实现了 ApplicationListener 事件监听接口的 Bean 可以接收到

容器事件, 并对容器事件进行响应处理

   

ApplicationContext 抽象实现类 AbstractApplicationContext 中,

可以发现存在一个 ApplicationEventMulticaster,它负责保存所有监

听器,以便在容器产生上下文事件时通知这些事件监听器

   

   

2)MessageSource

   

为容器提供了 I18N 国际化信息访问的功能

   

   

3)ReaourcePatternResolver

   

所有 ApplicationContext 实现类都实现了类似于

PathMatchingResourcePatternResolver 的功能,

可以通过带前缀 Ant 风格的资源类文件路径来装载

Spring 的配置文件

   

   

4)LifeCycle

   

该接口是 Spring 2.0 加入的,提供了 start() stop() 两个方法,

主要用于控制异步处理过程

   

在具体使用时,该接口同时被 ApplicationContext 实现及具体 Bean 实现,

ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接

口的 Bean,以达到管理和控制 JMX、任务调度等目的

   

 

   

BeanFactory 初始化相似,ApplicationContext 的初始化也很简单,

根据配置文件路径不同可选择不同的实现类加载:

   

1)ClassPathXmlApplicationContext:配置文件在类路径下

   

2)FileSystemXmlApplicationContext:配置文件在文件系统路径下

 

   

   

   

Bean 的实例化问题:

   

 ApplicationContext 的初始化和 BeanFactory 有一个重大的区别:

   

BeanFactory 在初始化容器时,并未实例化 Bean,直到第一次访问某个

Bean 时才实例目标 Bean,而 ApplicationContext 则在初始化应用上

下文时就实例化所有单实例的 Bean 

   

   

   

   

   

   

【made by siwuxie095】

BeanFactory和ApplicationContext的介绍