好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring BeanFactory 与 FactoryBean 的区别详情

前言:

在  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 。 

总结

BeanFactory  提供一个 Spring IOC 容器规范, 能够生产和管理 Bean 的一个工厂接口。但是  FactoryBean  是一种特殊的 Bean 创建方式,可以不必遵循 IOC 容器的规范,而是对 Bean 的一种扩展。对于复杂 Bean 对象创建和使用其可以封装对象的创建细节。

到此这篇关于Spring BeanFactory 与 FactoryBean 的区别详情的文章就介绍到这了,更多相关Spring BeanFactory 与 FactoryBean 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://juejin.cn/post/7082620724443086855

查看更多关于Spring BeanFactory 与 FactoryBean 的区别详情的详细内容...

  阅读:16次