beanFactory、ApplicationContext和FactoryBean的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了beanFactory、ApplicationContext和FactoryBean的区别相关的知识,希望对你有一定的参考价值。

参考技术A

spring提供了 两种不同的IOC容器 ,为beanFactory和applicationContext,都是接口。
ApplicationContext 继承于BeanFactory 【ApplicationContext 继承ListableBeanFactory;他们都可以用来配置XML属性,已支持属性的自动注入,ListableBeanFactory继承BeanFactory 】

BeanFactory
BeanFactory是IOC容器的顶级接口,是IOC容器的最基础实现,也是访问spring容器的根接口,负责对bean的创建,访问等工作。实现类功能比较单一,BeanFactory接口实现的容器,特点是每次获取对象时才会创建对象。

ApplicationContext
继承了BeanFactory接口,拥有BeanFactory的全部功能,并且扩展了很多高级特性,每次容器启动时就会创建所有的对象。

BeanFactory :

BeanFactory

前言

   spring ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器是DefaultListableBeanFactory

1.BeanFactory体系结构图 

 

一个最简单的BeanFactory的使用样例只需要几行代码:

BeanFactory beanFactory = new DefaultListableBeanFactory();
Resource resource = new ClasspathResource("beans.xml");
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(resource);

AbstractBeanFactory实现了依赖关系处理

AbstractAutowireCapleBeanFactory实现了bean的create过程 

DefaultListableBeanFactory实现了BeanDefinition的管理

下面看看beanfactory各接口功能的定义

1.首先是顶层的BeanFactory,从它的定义方法来看,主要提供获取Bean对象,判断给定的Bean对象是否被当前的BeanFactory加载过,是否是Singleton/Prototype,类型是否匹配,等等最基本的功能。

2.左边分支:ListableBeanFactory,此接口继承了BeanFactory的同时,提供了列举Bean的功能,它能够列举当前BeanFactory加载的所有bean:列举所有Bean的名字或者满足某种类型的bean的名字,根据类型返回所有bean对象等。但是它无法获取父层BeanFactory加载的单例bean

3.看中间分支:HierachicalBeanFactory和ConfigurableBeanFactory,AutowireCapableBeanFactory

    HierachicalBeanFactory比较简单,它主要提供父BeanFactory的功能,通过它能够获取当前BeanFactory的父BeanFactory。(比如,若在A工厂启动并加载bean之前,B工厂先启动并加载了,那B就是A的父工厂),这样就能让当前的beanfactory加载父beanfactory加载的bean了,弥补了ListableBeanFactory欠缺的功能。

    ConfigurableBeanFactory就是在HierachicalBeanFactory的基础上增加了可配置的功能,包括注册别名、注册单例、设置classloader、是否缓存BeanMetadata、设置BeanPostProcessor、配置Bean依赖等等。ConfigurableBeanFactory还继承了SingletonBeanRegistry接口主要是用来定义用来共享的bean实例的注册表,通过它可以使得BeanFactory实现统一的方式暴露其单例bean管理。

  AutowireCapableBeanFactory,主要是提供Bean的自动装配功能,为已有的Bean装配属性等

4.再看右边分支

  先是 SingletonBeanRegisty/DefautSigletonBeanRegistry/FactoryBeanRegistrySupport

SigletonBeanRegistry在前面已提到,DefaultSigletonBeanRegistry是它的默认实现类,它不仅支持SigletonBean的注册,也支持DisposableBean的注册管理用来清理要丢弃的bean以及他们依赖的资源。

FactoryBeanRegistrySupport主要是对FactoryBean的支持,获取FactoryBean、FactoryBean的类型,获取FactoryBean暴露的目标对象等。

  再是AbatractAutowireCapableBeanFacotry,实现AutowireCapableBeanFactory接口的bean装配功能,实现createBean autowireBean configBean()等方法。

DefaultListableBeanFactory继承AbatractAutowireCapableBeanFacotry功能的同时再实现了ConfigurableListableBeanFactory的功能,主要是实现了BeanDefinition的管理

2.

                     

以上是关于beanFactory、ApplicationContext和FactoryBean的区别的主要内容,如果未能解决你的问题,请参考以下文章

加载BeanFactory

BeanFactory

BeanFactory

Spring核心技术(十五)——BeanFactory

Spring的beanFactory与ApplicationContext区别

Spring之BeanFactory和FactoryBean的区别