讲讲BeanFactory和FactoryBean的区别
一、两者区别
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。
BeanFactory是Spring提供的存放Bean的工厂,FactoryBean是一个可生产Bean的工厂Bean。
在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。
BeanFactory和FactoryBean都可以用来创建对象,只不过创建的流程和方式不同!
当使用BeanFactory的时候,必须要严格的遵守bean的生命周期,经过一系列繁杂的步骤之后可以创建出单例对象,是流水线式的创建过程。
而FactoryBean是用户可以自定义bean对象的创建流程,不需要按照bean的生命周期来创建,在此接口中包含了三个方法:
isSingleton:判断是否是单例对象
getObjectType:获取对象的类型
getObject:在此方法中可以自己创建对象,使用new的方式或者使用代理的方式都可以,用户可以按照自己的需要随意去创建对象,在很多框架继承的时候都会实现FactoryBean接口,比如Feign!
二、BeanFactory
BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵守的最底层和最基本的编程规范。
在Spring代码中,BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,都是附加了某种功能的实现。
ApplicationContext,是BeanFactory的子接口!
使用场景
从Ioc容器中获取Bean(byName or byType)
检索Ioc容器中是否包含指定的Bean
判断Bean是否为单例
三、FactoryBean
FactoryBean是Spring提供给用户自定义Bean的工厂Bean,隐藏创建对象的细节。
一般情况下,Spring通过反射机制利用
如果按照传统的方式,则需要在
Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。
使用场景
FactoryBean在Spring中最为典型的一个应用就是用来创建AOP的代理对象。
我们知道AOP实际上是Spring在运行时创建了一个代理对象,也就是说这个对象,是我们在运行时创建的,而不是一开始就定义好的,这很符合工厂方法模式。更形象地说,AOP代理对象通过Java的反射机制,在运行时创建了一个代理对象,在代理对象的目标方法中根据业务要求织入了相应的方法。
这个对象在Spring中就是——ProxyFactoryBean。
所以,FactoryBean为我们实例化Bean提供了一个更为灵活的方式,我们可以通过FactoryBean创建出更为复杂的Bean实例。
四、总结
BeanFactory是所有Spring Bean的容器根接口。
FactoryBean是一种创建Bean的方式。
BeanFactory是所有Spring Bean的容器根接口,其给IoC容器提供了一套完整的规范。
FactoryBean是 一种创建Bean的方式,是对Bean的一种扩展。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· 万字调研——AI生成内容检测
· 解决跨域问题的这6种方案,真香!
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库