spring IOC BeanFactory和ApplicationContext

1、设计介绍

在Spring IOC 容器的设计中,有两个主要的容器系列,一个是实现Beanfactory接口的简单容器系列,这系列容器只实现了容器的最基本功能。另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。

第一设计主线
从接口BeanFactory 到HierarchicalBeanFactory 再到ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。在这条接口设计路径中,BeanFactory接口定义了基本的IOC容器规范。包括了getBean()这样获得Bean 接口。

HierarchicalBeanFactory 增加getParentBeanFactory接口的功能,使得BeanFactory具备了双亲IOC容器的管理功能。

ConfigurableBeanFactory 增加了一些配置功能,比如通过setParentBeanFactory 设置双亲IOC容器,通过增加addBeanPostProcessor 配置bean的后置处理器。

第二条设计主线
以ApplicationContext 应用上下文接口为核心的接口设计,这些设计的主要接口有:从BeanFactory 到ListableBeanFactory,再到ApplicationContext,再到ConfigureApplicationContext或者WebApplicationContex接口。

我们常用的上下文都是ConfigureableApplicationContext或者webApplicaitonContext的实现。

在这个接口体系中ListableBeanFactory和HierarchicalBeanFactory 两个接口是连接Beanfactory接口和ApplicationContext应用上下文的接口定义。

在ListableBeanFactory 细化了很多BeanFactory的接口功能,比如定义了getBeanDefinitionNames() 接口方法。

ApplicationContext接口 它通过继承MessageSource、ResourceLoader ApplicationEventPublisher接口,在BeanFactroy简单IOC容器的基础上增加了许多对高级容器的特性的支持。

BeanFactory中定义的接口方法:

通过接口方法containsBean让用户能够判断容器是否含有指定名字的Bean。
通过接口方法isSingleton来查询指定名字的Bean是否是Singleton类型的Bean。
对于Singleton 属性,用户可以在BeanDefinition中指定。
通过接口方法isPrototype 来查询指定名字的Bean 是否是Prototype 类型,这个属性也是在BeanDefinition中指定。

通过接口方法IisTypeMatch 来查询指定了名字的Bean的Class 类型是否是特定的Class类型。
通过接口方法getType来查询指定名字的Bean的Class类型
通过接口方法getAliases 来查询指定了名字的Bean的所有别名,这些别名都是用户在BeanDefinition中定义的。

2、BeanFactory的设计原理

以XmlBeanFactory 的实现为例来说明简单IOC容器的设计原理。

XmlBeanFactory是IOC容器的最底层实现,它是在继承DefaultListableBeanFactory的基础上,增加了处理XMl定义的bean信息的容器。在XmlBeanFactory 是以XmlBeanDefinitonReader对象来完成的。 在XmlBeanFactory 首先需要得到Resource对象,对XmlBeanDefinitionReader
对象的初始化,以及使用这个对象来完成对loadBeanDefinition的调用,就是这个调用启动从Resource中载入BeanDefinition的过程,LoadBeanDefinition同时也是IOC容器初始化的重要组成部分。

我们以编程的方式使用DefaultListableBeanFactory。
代码如下:

        ClassPathResource res = new ClassPathResource("Bean.xml");
        DefaultListableBeanFactory factory = new DefaultListabelBeanFactory();
        XmlBeanDefintionReader reader = new XmlBeanDefintionReader(factory);
        reader.loadBeanDefintions(res);

总结步骤如下:

创建IOC配置文件的抽象资源,这个抽象资源包含了BeanDefintion的定义信息。
创建一个BeanFactory 。
创建一个载入BeanDefinition的读取器,这里使用XmlBeanDefintionReader来载入Xml文件形式的BeanDefinition,通过一个回调配置给BeanFactory。

从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义之后,需要的IOC容器就建立起来了。

ApplicationContext的应用场景:

ApplicationContext增加的功能:

支持不同的信息源 通过扩展接口MessageSource实现。
访问资源。 这一特性体现在ResourceLoader和Resouce的实现上,这样我们就可以从不同的地方得到Bean定义资源。
支持应用事件 通过继承接口ApplicaitonEventPublisher实现。
在ApplicatonContext提供的附加服务。

我们以FileSystemXmlApplicationContext的实现来说明ApplicationContext的设计原理。

在FileSystemXmlApplicationContext的设计中,我们看到ApplicationContext应用上下文的主要功能已经在它的基类AbstractXmlApplicationContext中实现了。 在FileSystemXmlApplicationContext中作为一个具体应用上下文,只需要实现和它自身设计相关的两个功能。

一个功能是,实例化FileSystemXmlApplicationContext时,需要启动IOC容器的refresh过程。

另一个功能是从文件中读取以xml形式存在的BeanDefinition做准备。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: BeanFactoryApplicationContext 是在 Spring 框架中用于管理 Bean 对象的两个重要接口。 BeanFactorySpring 框架中最基本的容器,它主要提供了对 Bean 的实例化、配置和管理的功能。 ApplicationContextBeanFactory 的一个子接口,它在 BeanFactory 的基础上提供了更多高级的特性,如国际化、事件传递等。 总的来说,如果只需要基本的 Bean 管理功能,可以使用 BeanFactory;如果需要使用更多高级特性,则可以使用 ApplicationContext。 ### 回答2: BeanFactoryApplicationContext都是Spring框架中用来管理Bean的容器,但它们之间也有一些不同之处。 BeanFactorySpring框架最基本的容器接口,它提供了最基本的IOC容器功能。 它的主要责任是实例化、配置和管理应用程序中的对象。它通过读取配置文件或者注解来创建和管理Bean对象,可以单例或者多例的方式提供Bean。它使用延迟初始化的方式进行Bean的实例化,即只有在真正使用Bean时才会进行实例化,从而避免了不必要的资源消耗。BeanFactory是一个底层的接口,对于开发者而言使用的更多的是其子类ApplicationContextApplicationContextBeanFactory的子接口,它提供了更丰富的功能和更方便的使用方式。ApplicationContext除了提供BeanFactory的功能外,还可以直接集成AOP、事件传播、国际化信息等功能。它支持更多类型的Bean,比如单例、多例以及原型等。它提供了更多的钩子方法,比如Bean的初始化和销毁操作等。ApplicationContext还支持通过容器的扩展机制来实现定制化需求,比如自定义Bean的创建方式、属性注入方式等。 总结起来,BeanFactorySpring框架最基本的IOC容器接口,提供了实例化和管理Bean的基本功能。而ApplicationContextBeanFactory的子接口,提供了更多高级功能和更方便的使用方式。在实际开发中,我们更多地会使用ApplicationContext来管理Bean,因为它提供了更多的功能和灵活性,能够更好地满足我们的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值