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


猜你喜欢
- 一、Canvas Canvas中的方法很多,这里我们只挑常用的进行讲解说明 Canvas可以绘制的对象有:弧线(arcs) canvas.填
- 折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。A 搜素过程从数组的中间元素开始,如果中间元素正好是要查
- 笔者在使用Entity Framework中的Scaffolding机制自动创建拓展名为mdf的数据库及表单时,遇到如下的错误:A file
- 前章知识: 点此跳转HTML简介:超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。这些相互关联的信息
- 实践仿照@EnableEurekaServer实现自动装配如果你使用过Eureka作为微服务的注册中心,那么对@EnableWebConfi
- 这篇文章主要介绍了spring boot如何加入mail邮件支持,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 本文实例为大家分享了java实现超市管理系统的具体代码,供大家参考,具体内容如下一、使用技术javaSE二、实现功能超市管理系统具体要求如下
- 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Ap
- 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位class Base {Base() {System.out.p
- 本文实例讲述了android编程之ip2id程序。分享给大家供大家参考。具体分析如下:一、说明:公司一个项目中需要给一系列网络设备分配id号
- 文件的重命名与移动操作有时候为了对文件进行统一访问与管理,需要把文件进行重命名,并移动到新的文件夹,如何实现呢?一枚简单的java小程序即可
- android中常常要用到ListView,有时也要用到ExpandableListView,如在手机设置中,对于分类有很好的效果,会用Li
- 开发工具下载:Tomcat下载:wget http://learning.happymmall.com/tomcat/apache-tomc
- 一、实验目的(1)掌握应用黑盒测试技术进行测试用例设计。(2)掌握对测试用例进行优化设计方法。二、实验内容日期问题测试以下程序:该程序有三个
- 一、业务背景有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。二、分析流程
- 在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties
- C#的MVC寻找对应的控制器首先是寻找当前域的如果找不到就会寻找备用的..但是有些时候我们是不想他去寻找备用的控制器.这里就涉及到了一个Da
- 最近项目需要通过经纬度查询 具体的地址和区域名称,通过查询网络资源,发现提供的大多是得到具体的地址而对区域或城市名称的获取就不是很好把握;在
- 前言大家都知道在Java中,除了8种基本数据类型外,其他的都是引用类型。使用引用类型是为了更好地贯彻面向对象的思想,那为什么还要保留8种基本
- 向上转型:子类对象转为父类,父类可以是接口。公式:Father f = new Son();Father是父类或接口,son是子类。向下转型