• 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 的形式以Bean结尾,表示它是⼀个Bean,不同于普通Bean的是:它是实现了 FactoryBean 接⼝的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配置、资源路径访问方式、事件传递等。

  • 相关阅读:
    Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
    使用cmake出现编译成功,运行却说找不到库?
    数据可视化实验一:Panda数据处理及matplotlib绘图初步
    MHA高可用配置及故障切换
    NPM 常用命令(十二)
    如何开始用Python编程
    Windows进程的创建与结束
    2021最新Java笔试题及答案,Java面试真题精选
    点云从入门到精通技术详解100篇-基于三维点云的并联机器人 抓取
    pytorch lightning最简上手
  • 原文地址:https://blog.csdn.net/weixin_42585386/article/details/127760300