Spring BeanFactory 与 FactoryBean 的区别详情
作者:??斜月???? 时间:2023-12-23 02:51:46
前言:
在 Spring
中, IOC
是很重要的概念,其本质就是 map 结构,存储容器和业务 Bean 信息。但是BeanFactory
和 FactoryBean
的区别却是一个很重要的知识点,在本文中将结合源码进行分析讲解。
区别和联系
BeanFactory
在 Spring
中,所有的 Bean
都是由 BeanFactory
(也就是 IOC 容器)来进行管理的。BeanFactory
定义了容器的基本形式,并规定了 IOC 容器的基本接口以及生命周期,针对 BeanFactory 的实现类也有很多,比如ApplicationContext
、DefaultListableBeanFactory
、XmlBeanFactory
都是其添加了附加功能的接口。BeanFactory
创建的 Bean
对象需要遵循以下的生命周期形式,并且 Bean
的生产都是通过反射机制来实现的。
在英文中,Aware
是意识的意思,可以看到 BeanFactory
的生命周期流程包含了诸多的 Aware
接口:
以下为 BeanFactory
接口生命周期相关的一下方法,在项目开发中,ApplicationContextAware
、InitializingBean
和 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 本身,那么需要添加 & 符号作为前缀进行处理。
FactoryBean
但是在某些具体的情况下,实例化 Bean
的操作会很复杂,按照其要求需要配置大量的属性,此时 Bean
的配置灵活性就受到了限制,此时就需要使用到 FactoryBean
了,该接口可以按照用户的需求来构造 Bean
对象,而不再遵守 Bean
生命周期的流程。Spring
自身就提供了很多 FactoryBean
的实现, 它们隐藏了实例化的一系列复杂细节,给上层应用带来了便利。自从 Srping3.0 开始 FactoryBean
开始支持泛型,即接口声明改为 FactoryBean<T>
的形式,在 FactoryBean
的应用中,SqlSessionFactoryBean
就是很好的实践,在操作数据库的过程中,提供了创建 SqlSession
的工厂 Factory
。
来源:https://juejin.cn/post/7082620724443086855
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android应用强制更新APP的示例代码
SpringBoot结合Neo4j自定义cypherSql的方法
Android开发之imageView图片按比例缩放的实现方法
JAVA中ListIterator和Iterator详解与辨析(推荐)
C# 设置Chart的X轴为时间轴详情
![](https://img.aspxhome.com/file/2023/2/119512_0s.png)
Android调用应用安装界面方法
![](https://img.aspxhome.com/file/2023/4/94954_0s.jpg)
使用maven profile指定配置文件打包适用多环境的方法
![](https://img.aspxhome.com/file/2023/7/64507_0s.png)
springboot对接支付宝支付接口(详细开发步骤总结)
![](https://img.aspxhome.com/file/2023/6/58746_0s.png)
解析java基本数据类型传递与引用传递区别
![](https://img.aspxhome.com/file/2023/8/113458_0s.png)
SpringMVC路径匹配中使用通配符问题
Android设置默认锁屏壁纸接口的方法
C语言线索二叉树基础解读
![](https://img.aspxhome.com/file/2023/0/120780_0s.png)
Android自定义组件获取本地图片和相机拍照图片
![](https://img.aspxhome.com/file/2023/1/101831_0s.gif)
java基础之String知识总结
![](https://img.aspxhome.com/file/2023/9/118839_0s.png)
Android apk 插件启动内存释放问题
C#控制台下测试多线程的方法
一篇文章带你初步认识Maven
![](https://img.aspxhome.com/file/2023/7/68007_0s.png)
MyBatis自定义映射关系和关联查询实现方法详解
![](https://img.aspxhome.com/file/2023/2/60902_0s.png)