Spring源码 – 核心接口FactoryBean「建议收藏」

Spring源码 – 核心接口FactoryBean「建议收藏」Spring源码-核心接口FactoryBean

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Spring源码 – 核心接口FactoryBean

Spring版本:Spring 5.3.13-release


一般情况下,Spring是通过反射机制,利用在Bean进行声明时的class属性指定的实现类来进行Bean的实例化操作。但是在某些场景下,Bean的实例化操作时非常复杂繁琐的,如果按照传统的方式,则需要在<bean></bean>中进行大量配置信息的声明,这种配置方式的灵活性会受到非常大的局限性的。而如果采用编码的方式进行声明可能会变得非常简单。org.springframework.beans.factory.FactoryBean<T>接口应运而生,用户可以实现该接口来定制实例化Bean的逻辑。

# 1、核心接口FactoryBean

FactoryBean<T>Spring占据非常重要的地位。很多第三方中间件都是通过实现FactoryBean<T>接口进行实例化。如open-feign

FactoryBean<T>接口中一共定义了三个方法:

public interface FactoryBean<T> { 
   

	/** * The name of an attribute that can be * {@link org.springframework.core.AttributeAccessor#setAttribute set} on a * {@link org.springframework.beans.factory.config.BeanDefinition} so that * factory beans can signal their object type when it can't be deduced from * the factory bean class. * @since 5.2 */
	String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";


	/** * Return an instance (possibly shared or independent) of the object * managed by this factory. * <p>As with a {@link BeanFactory}, this allows support for both the * Singleton and Prototype design pattern. * <p>If this FactoryBean is not fully initialized yet at the time of * the call (for example because it is involved in a circular reference), * throw a corresponding {@link FactoryBeanNotInitializedException}. * <p>As of Spring 2.0, FactoryBeans are allowed to return {@code null} * objects. The factory will consider this as normal value to be used; it * will not throw a FactoryBeanNotInitializedException in this case anymore. * FactoryBean implementations are encouraged to throw * FactoryBeanNotInitializedException themselves now, as appropriate. * @return an instance of the bean (can be {@code null}) * @throws Exception in case of creation errors * @see FactoryBeanNotInitializedException * @see FactoryBean#isSingleton() * @see org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonObjects */
	@Nullable
	T getObject() throws Exception;

	/** * Return the type of object that this FactoryBean creates, * or {@code null} if not known in advance. * <p>This allows one to check for specific types of beans without * instantiating objects, for example on autowiring. * <p>In the case of implementations that are creating a singleton object, * this method should try to avoid singleton creation as far as possible; * it should rather estimate the type in advance. * For prototypes, returning a meaningful type here is advisable too. * <p>This method can be called <i>before</i> this FactoryBean has * been fully initialized. It must not rely on state created during * initialization; of course, it can still use such state if available. * <p><b>NOTE:</b> Autowiring will simply ignore FactoryBeans that return * {@code null} here. Therefore it is highly recommended to implement * this method properly, using the current state of the FactoryBean. * @return the type of object that this FactoryBean creates, * or {@code null} if not known at the time of the call * @see ListableBeanFactory#getBeansOfType */
	@Nullable
	Class<?> getObjectType();

	/** * Is the object managed by this factory a singleton? That is, * will {@link #getObject()} always return the same object * (a reference that can be cached)? * <p><b>NOTE:</b> If a FactoryBean indicates to hold a singleton object, * the object returned from {@code getObject()} might get cached * by the owning BeanFactory. Hence, do not return {@code true} * unless the FactoryBean always exposes the same reference. * <p>The singleton status of the FactoryBean itself will generally * be provided by the owning BeanFactory; usually, it has to be * defined as singleton there. * <p><b>NOTE:</b> This method returning {@code false} does not * necessarily indicate that returned objects are independent instances. * An implementation of the extended {@link SmartFactoryBean} interface * may explicitly indicate independent instances through its * {@link SmartFactoryBean#isPrototype()} method. Plain {@link FactoryBean} * implementations which do not implement this extended interface are * simply assumed to always return independent instances if the * {@code isSingleton()} implementation returns {@code false}. * <p>The default implementation returns {@code true}, since a * {@code FactoryBean} typically manages a singleton instance. * @return whether the exposed object is a singleton * @see #getObject() * @see SmartFactoryBean#isPrototype() * * 返回由 FactoryBean 创建的 Bean 实例的作用域是单例还是原型 * true -> singleton / false -> prototype */
	default boolean isSingleton() { 
   
		return true;
	}

}
  • getObject():返回由FactoryBean创建的Bean实例,如果isSingleton()返回true,则该Bean实例会放入Spring的一级缓存中。
  • getObjectType():返回FactoryBean创建的Bean类型。
  • isSingleton():返回由FactoryBean创建的Bean实例的作用域是单例还是原型。

当声明Bean时指定的class属性为FactoryBean<T>接口的实现类时,Spring容器通过getBean()方法获取的Bean实例为T,即为getObject()方法返回的实例对象。也就是说此时FactoryBean<T>#getObject()方法代理了getBean()方法。如果需要获取此FactoryBean<T>实例,则需要通过&+BeanName进行获取。

# 2、BeanFactoryFactoryBean<T>

需要注意的是,BeanFactoryFactoryBean<T>是两个完全不同概念的接口。BeanFactory根据命名可以看出,它是一个工厂。而FactoryBean<T>根据命名也可以很清晰的看出,它是一个BeanBeanFactorySpring对于IOC思想实现的最基本方式,它提供了对Bean的管理。而FactoryBean<T>Spring针对复杂类型Bean的实例化,允许开发者对此类型的Bean进行的高级定制处理。

GitHub源码地址https://github.com/kapbc/kapcb-spring-source/tree/master/Spring-Framework-v5.3.13

备注:此文为笔者学习Spring源码的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170037.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月12日 上午8:46
下一篇 2022年8月12日 上午9:00


相关推荐

  • JS处理文件流

    JS处理文件流最近做一个项目 遇到了一个问题 就是导出 Excel 功能 多普通呀 多大众化 哪里都有 可惜我们后台说给我 JSON 数据 自己处理 我果断拒绝了 拒绝的里有是我菜 实现不了啊 然后后台开发看不下去了 就是转成文件流给我吧 他们那里是分布式部署 也没有办法持久化存储 遂发生了一下的故事百度没有怎么做过 肯定是百度啦 然后找打了一段代码 代码内容如下 functiondown

    2026年3月18日
    2
  • pycharm统一缩进快捷键_pycharm 注释快捷键

    pycharm统一缩进快捷键_pycharm 注释快捷键1.批量注释:选择要注释的文本行,背景变化后,同时按Ctrl+/2.取消批量注释:选择已注释的文本行,背景变化后,同时按Ctrl+/3.批量缩进:选择要缩进的文本行,背景变化后,按下TAB键4.取消批量缩进:选择要缩进的文本行,背景变化后,按下SHIFT+TAB键…

    2022年8月27日
    9
  • django验证码登录_实名认证验证库中无此信息

    django验证码登录_实名认证验证库中无此信息djoser是什么?作用:Django认证系统的REST实现。djoser库提供了一组DjangoRestFramework视图,用于处理注册、登录、注销、密码重置和帐户激活等基本操作。它适用于

    2022年7月31日
    5
  • spring事务管理器设计思想(一)「建议收藏」

    spring事务管理器设计思想(一)「建议收藏」spring事务管理器设计思想(一)

    2022年4月21日
    61
  • 火狐破解收费hackbar「建议收藏」

    火狐破解收费hackbar「建议收藏」https://blog.csdn.net/qq_38963246/article/details/95489242

    2022年6月10日
    45
  • IDEA 配置SVN ,SVN安装后没有svn.exe

    IDEA 配置SVN ,SVN安装后没有svn.exe在idea中配置svn,首先要在电脑上安装svn(进入官网下载安装即可);svn官网下载地址:https://tortoisesvn.net/downloads.html第二,打开idea,选择file->settings->VersionControl->Subversion,OK完成;如果发现找不到svn.exe?之…

    2022年5月14日
    271

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号