BeanFactory和FactoryBean区别(附BeanFactory和ApplicationContext的区别)

目录

问题现象:

问题分析:

解决方法:

1、BeanFactory:

2、FactoryBean:

拓展:

1、BeanFactory Bean对象工厂:

2、ApplicationContext 应用上下文:


问题现象:

        最近在复习Spring和Springboot的时候,看到一条面试题:

        BeanFactory和FactoryBean区别?


问题分析:

        这个问题要回答BeanFactory可能很简单,因为它就是IOC容器的核心接口类;而关键在于FactoryBean是什么呢?

       从网上也看到了一些回答,和我想的大致相同,不过有一些细节是我不知道的,所以在这里我就大概地总结并记录一下吧。


解决方法:

1、BeanFactory:

        Spring最底层的工厂接口类,它是IOC容器的核⼼根接⼝,所以它并不是IOC容器的具体实现。在Spring中,定义了很多BeanFactory的实现类,根据具体的情况Spring会通过这些实现类来创建bean对象,因此所有的Bean对象都是由BeanFactory(也就是IOC容器)来进⾏管理的(当然还有我们常说的ApplicationContext接口类,也是通过接口的多继承特点,最终继承自BeanFactory)。BeanFactory负责最基础的生产、配置和管理bean对象及bean对象间的依赖关系。

2、FactoryBean:

        接口类,它是一个可以返回bean对象的工厂Bean。由于xml注册bean的方式很受限,所以Spring允许用户通过实现FactoryBean接口类的方法,创建自定义的Bean对象,同时也能在创建过程中加入自定义的逻辑(熟悉Bean对象生命周期的伙伴应该都记得,在Bean对象的初始化阶段和销毁阶段,会有调用自定义初始化方法和自定义销毁方法的逻辑)。FactoryBean的两种生产对象的方法:

        2.1、BeanFactory.getBean("&自定义Bean对象的名字"):获取用户自定义的FactoryBean实现类对象(注意最前面要带上“&”符号),在单例模式下该对象只会是同一个;

        2.2、BeanFactory.getBean("自定义Bean对象的名字"):创建一个用户自定义的Bean对象,实际调用了FactoryBean.getObject()方法,相当于new了一个对象,不会兼容单例模式

下面是我摘抄自网上的一些对于FactoryBean的说法:

        FactoryBean接⼝对于Spring框架来说占⽤重要的地位,Spring⾃身就提供了70多个FactoryBean的实现。它们隐藏了实例化⼀些复杂Bean的细节,给上层应⽤带来了便利。

        从Spring3.0开始,FactoryBean开始⽀持泛型,即接⼝声明改为 FactoryBean<T> 的形式以Bean结尾,表示它是⼀个Bean,不同于普通Bean的是:它是实现了 FactoryBean<T> 接⼝的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,⽽不是FactoryBean本身,如果要获取FactoryBean对象,请在id前⾯加⼀个&符号来获取。


拓展:

        既然前面已经提到了ApplicationContext,那这里我再顺便总结一下BeanFactoryApplicationContext的区别吧:

1、BeanFactory Bean对象工厂

        Spring 框架的IOC容器。

        它是一个接口类,里面定义了许多用于配置、创建、管理bean对象的方法;

        需要编写源代码去手动注册Bean对象

        采用懒加载方式注入Bean,对象使用时才会实例化,实例化后才知道有没有错误;

2、ApplicationContext 应用上下文

        Spring 框架的IOC容器。

        它是 BeanFactory 的子接口类,实现了自动化注入对象,管理着Bean对象之间的依赖关系。

        自动注册Bean对象,通过xml注解方式可以让spring实现自动配置。

        采用预加载方式注入Bean,在容器启动后加载所有bean对象,只要有错误则在容器一启动就能马上知道。当然,预加载肯定会导致更加占用空间和程序启动效率变慢,但是利大于弊。

        其他的拓展功能:支持国际化properties配置、资源路径访问方式、事件传递等。

猜你喜欢

转载自blog.csdn.net/weixin_42585386/article/details/127760300