Spring BeanFactory 与 FactoryBean 的区别详情

作者:??斜月???? 时间:2023-12-23 02:51:46 

前言:

在 Spring 中, IOC 是很重要的概念,其本质就是 map 结构,存储容器和业务 Bean 信息。但是BeanFactory 和 FactoryBean 的区别却是一个很重要的知识点,在本文中将结合源码进行分析讲解。

区别和联系

BeanFactory

在 Spring 中,所有的 Bean 都是由 BeanFactory (也就是 IOC 容器)来进行管理的。BeanFactory 定义了容器的基本形式,并规定了 IOC 容器的基本接口以及生命周期,针对 BeanFactory 的实现类也有很多,比如ApplicationContextDefaultListableBeanFactoryXmlBeanFactory 都是其添加了附加功能的接口。BeanFactory 创建的 Bean 对象需要遵循以下的生命周期形式,并且 Bean 的生产都是通过反射机制来实现的。

在英文中,Aware 是意识的意思,可以看到 BeanFactory 的生命周期流程包含了诸多的 Aware 接口:

Spring BeanFactory 与 FactoryBean 的区别详情

以下为 BeanFactory 接口生命周期相关的一下方法,在项目开发中,ApplicationContextAwareInitializingBean 和 DisposableBean 有这广泛的应用。

  • BeanNameAware.setBeanName 用于设置 Bean 的名称

  • BeanClassLoaderAware.setBeanClassLoader 设置类加载器

  • BeanFactoryAware.setBeanFactory 设置 bean 工厂

  • ResourceLoaderAware.setResourceLoader 设置资源加载器

  • ApplicationEventPublisherAware.setApplicationEventPublisher 设置事件发布器

  • MessageSourceAware.setMessageSource 设置信息资源

  • ApplicationContextAware.setApplicationContext 设置应用上下文

  • ServletContextAware.setServletContext 设置 Servlet 上下文

  • BeanPostProcessor.postProcessBeforeInitialization 前置处理器

  • InitializingBean.afterPropertiesSet Bean 初始化操作

  • RootBeanDefinition.getInitMethodName 设置Bean 的初始化方法名称

  • BeanPostProcessor.postProcessAfterInitialization 后置处理器

  • DisposableBean.destroy 设置 Bean 销毁

  • RootBeanDefinition.getDestroyMethodName 获取 Bean 销毁的方法

默认情况下,如果直接调用 getBean 方法,将会返回一个工厂创造的对象,如果想获取 Bean 本身,那么需要添加 & 符号作为前缀进行处理。

Spring BeanFactory 与 FactoryBean 的区别详情

FactoryBean

但是在某些具体的情况下,实例化 Bean 的操作会很复杂,按照其要求需要配置大量的属性,此时 Bean 的配置灵活性就受到了限制,此时就需要使用到 FactoryBean 了,该接口可以按照用户的需求来构造 Bean 对象,而不再遵守 Bean 生命周期的流程。Spring 自身就提供了很多 FactoryBean 的实现, 它们隐藏了实例化的一系列复杂细节,给上层应用带来了便利。自从 Srping3.0 开始 FactoryBean 开始支持泛型,即接口声明改为 FactoryBean<T> 的形式,在 FactoryBean 的应用中,SqlSessionFactoryBean 就是很好的实践,在操作数据库的过程中,提供了创建 SqlSession 的工厂 Factory。 

Spring BeanFactory 与 FactoryBean 的区别详情

来源:https://juejin.cn/post/7082620724443086855

标签:Spring,BeanFactory,FactoryBean
0
投稿

猜你喜欢

  • Android应用强制更新APP的示例代码

    2022-07-28 09:00:07
  • SpringBoot结合Neo4j自定义cypherSql的方法

    2022-05-18 00:41:07
  • Android开发之imageView图片按比例缩放的实现方法

    2023-01-09 21:52:51
  • JAVA中ListIterator和Iterator详解与辨析(推荐)

    2021-06-11 16:47:19
  • C# 设置Chart的X轴为时间轴​​​​​​​详情

    2022-03-14 12:48:30
  • Android调用应用安装界面方法

    2021-05-25 18:29:20
  • 使用maven profile指定配置文件打包适用多环境的方法

    2022-06-30 03:49:11
  • springboot对接支付宝支付接口(详细开发步骤总结)

    2023-11-10 23:07:35
  • 解析java基本数据类型传递与引用传递区别

    2022-04-14 18:37:19
  • SpringMVC路径匹配中使用通配符问题

    2023-07-18 20:44:03
  • Android设置默认锁屏壁纸接口的方法

    2021-09-25 00:16:42
  • C语言线索二叉树基础解读

    2023-03-31 12:04:55
  • Android自定义组件获取本地图片和相机拍照图片

    2022-07-09 21:54:48
  • java基础之String知识总结

    2022-09-24 16:25:20
  • Android apk 插件启动内存释放问题

    2022-05-16 07:26:39
  • C#控制台下测试多线程的方法

    2022-02-19 15:43:51
  • 一篇文章带你初步认识Maven

    2023-08-31 01:56:14
  • MyBatis自定义映射关系和关联查询实现方法详解

    2021-12-18 21:25:28
  • Java中高效判断数组中是否包含某个元素的几种方法

    2022-02-21 05:46:39
  • c#获取gridview的值代码分享

    2023-06-27 22:23:50
  • asp之家 软件编程 m.aspxhome.com