BeanFactory与FactoryBean

解释:https://www.cnblogs.com/aspirant/p/9082858.html

FactoryBean:https://zhuanlan.zhihu.com/p/543167464
由 BeanFactory 中使用的对象实现的接口,这些对象本身就是单个对象的工厂。如果 Bean 实现了此接口,则将其用作要公开的对象的工厂,而不是直接用作将自身公开的 Bean 实例。
注意:实现此接口的 Bean 不能用作普通 Bean。FactoryBean 以 Bean 样式定义,但为 Bean 引用公开的对象 (getObject()) 始终是它创建的对象。
FactoryBeans可以支持单例和原型,并且可以按需懒惰地创建对象,也可以在启动时急切地创建对象。SmartFactoryBean接口允许公开更细粒度的行为元数据。
此接口在框架本身中大量使用,例如用于AOP org.springframework.aop.framework.ProxyFactoryBean或org.springframework.jndi.JndiObjectFactoryBean。它也可以用于自定义组件;但是,这仅适用于基础结构代码。
FactoryBean是一个程序化合同。实现不应该依赖于注释驱动的注入或其他反射工具。getObjectType() getObject() 调用可能会在引导过程的早期到达,甚至在任何后处理器设置之前到达。如果您需要访问其他 bean,请实现 BeanFactoryAware 并以编程方式获取它们。
容器只负责管理 FactoryBean 实例的生命周期,而不负责管理 FactoryBean 创建的对象的生命周期。因此,不会自动调用公开的 Bean 对象(如 java.io.Closeable.close())上的 destroy 方法。相反,FactoryBean 应该实现 DisposableBean,并将任何此类紧密调用委托给底层对象。
最后,FactoryBean 对象参与包含 BeanFactory 的 Bean 创建的同步。通常不需要内部同步,除了在 FactoryBean 本身(或类似)中进行延迟初始化。

BeanFactory:
用于访问 Spring Bean 容器的根接口。
这是 Bean 容器的基本客户端视图;其他接口,如ListableBeanFactory和org.springframework.beans.factory.config.ConfigurableBeanFactory可用于特定目的。
此接口由保存许多 Bean 定义的对象实现,每个定义都由 String 名称唯一标识。根据 Bean 定义,工厂将返回包含对象的独立实例(原型设计模式)或单个共享实例(单例设计模式的优越替代方案,其中实例是工厂范围内的单例)。返回哪种类型的实例取决于 Bean 工厂配置:API 是相同的。从Spring 2.0开始,根据具体的应用程序上下文(例如Web环境中的“请求”和“会话”范围),可以使用更多范围。
这种方法的要点是,BeanFactory 是应用程序组件的中央注册表,并集中配置应用程序组件(例如,单个对象不再需要读取属性文件)。有关此方法的好处的讨论,请参见“专家一对一 J2EE 设计和开发”的第 4 章和第 11 章。
请注意,通常最好依靠依赖注入(“推送”配置)通过资源库或构造函数配置应用程序对象,而不是使用任何形式的“拉取”配置,如 BeanFactory 查找。Spring 的依赖注入功能是使用此 BeanFactory 接口及其子接口实现的。
通常,BeanFactory 将加载存储在配置源(例如 XML 文档)中的 Bean 定义,并使用 org.springframework.beans 包来配置 bean。但是,实现可以简单地直接在 Java 代码中根据需要返回它创建的 Java 对象。对如何存储定义没有任何限制:LDAP、RDBMS、XML、属性文件等。鼓励实现支持bean之间的引用(依赖注入)。
与 ListableBeanFactory 中的方法相反,此接口中的所有操作还将检查父工厂是否为分层 BeanFactory。如果在此工厂实例中找不到 Bean,则将询问直接父工厂。此工厂实例中的 Bean 应该覆盖任何父工厂中同名的 Bean。
Bean 工厂实现应尽可能支持标准 Bean 生命周期接口。全套初始化方法及其标准顺序为:
BeanNameAware’s setBeanName
BeanClassLoaderAware’s setBeanClassLoader
BeanFactoryAware’s setBeanFactory
环境感知的集合环境
EmbeddedValueResolverAware’s setEmbeddedValueResolver
ResourceLoaderAware的setResourceLoader(仅在应用程序上下文中运行时适用)
ApplicationEventPublisherAware’s setApplicationEventPublisher(仅在应用程序上下文中运行时适用)
MessageSourceAware’s setMessageSource(仅在应用程序上下文中运行时适用)
ApplicationContextAware’s setApplicationContext(仅在应用程序上下文中运行时适用)
ServletContextAware的setServletContext(仅在Web应用程序上下文中运行时适用)
postProcessBeforeBeanPostProcessor的初始化方法
初始化 Bean 的 afterPropertiesSet
自定义初始化方法定义
后进程后 BeanPostProcessor 的初始化方法
在 Bean 工厂关闭时,以下生命周期方法适用:
postProcessBefore销毁方法的销毁AwareBeanPostProcessor
一次性豆的破坏
自定义销毁方法定义

posted @ 2022-11-07 23:43  小小白兔兔  阅读(11)  评论(0编辑  收藏  举报  来源