当前位置 博文首页 > 丰极:springboot源码解析-管中窥豹系列之BeanDefinition(八)

    丰极:springboot源码解析-管中窥豹系列之BeanDefinition(八)

    作者:丰极 时间:2021-02-08 18:25

    一、前言

    • Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去。
    • 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot源码管中窥豹系列。

     简介

    二、BeanDefinition

    • spring帮我们管理bean,就是通过BeanDefinition实现的,要深研源码,就绕不开BeanDefinition
    • 我们通过源码来看看BeanDefinition到底做了什么

    三、源码分析

    我们先看看这个类:BeanDefinition

    public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    
    	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    
    	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    
    	int ROLE_APPLICATION = 0;
    
    	int ROLE_SUPPORT = 1;
    
    	int ROLE_INFRASTRUCTURE = 2;
    
    	void setParentName(@Nullable String parentName);
    
    	@Nullable
    	String getParentName();
    
    	void setBeanClassName(@Nullable String beanClassName);
    
    	@Nullable
    	String getBeanClassName();
    
    	void setScope(@Nullable String scope);
    
    	@Nullable
    	String getScope();
    
    	void setLazyInit(boolean lazyInit);
    
    	boolean isLazyInit();
    
    	void setDependsOn(@Nullable String... dependsOn);
    
    	@Nullable
    	String[] getDependsOn();
    
    	void setAutowireCandidate(boolean autowireCandidate);
    
    	boolean isAutowireCandidate();
    
    	void setPrimary(boolean primary);
    
    	boolean isPrimary();
    
    	void setFactoryBeanName(@Nullable String factoryBeanName);
    
    	@Nullable
    	String getFactoryBeanName();
    
    	void setFactoryMethodName(@Nullable String factoryMethodName);
    
    	@Nullable
    	String getFactoryMethodName();
    
    	ConstructorArgumentValues getConstructorArgumentValues();
    
    
    	default boolean hasConstructorArgumentValues() {
    		return !getConstructorArgumentValues().isEmpty();
    	}
    
    	MutablePropertyValues getPropertyValues();
    
    
    	default boolean hasPropertyValues() {
    		return !getPropertyValues().isEmpty();
    	}
    
    
    	boolean isSingleton();
    
    
    	boolean isPrototype();
    
    
    	boolean isAbstract();
    
    
    	int getRole();
    
    
    	@Nullable
    	String getDescription();
    
    	@Nullable
    	String getResourceDescription();
    
    	@Nullable
    	BeanDefinition getOriginatingBeanDefinition();
    
    }
    

    定义了一个bean的各种属性:

    • 父类:setParentName
    • class名称:setBeanClassName
    • 作用域:setScope
    • 懒加载:setLazyInit
    • 依赖: setDependsOn
    • 被依赖: setAutowireCandidate
    • 自动加载:setPrimary
    • 工厂bean: setFactoryBeanName
    • 工厂方法:setFactoryMethodName
    • 单例:isSingleton
    • 多例:isPrototype
    • 静态:isAbstract

    我们用idea打开图属性看看:

     beanDefinition

    • 继承了AttributeAccessor,拥有获取属性的能力
    • 继承了BeanMetadataElement,拥有了获取源的能力
    • 定义了各种接口,用来描述一个bean

    我们在看看它的实现类:

     beanDefinition

    • spring的常用方式:定义接口,写抽象类实现接口(核心功能写在这里),各种实现
    • 接口:BeanDefinition
    • 抽象类: AbstractBeanDefinition
    • 实现类:RootBeanDefinition,ChildBeanDefinition,GenericBeanDefinition,AnnotatedGenericBeanDefinition,ScannedGenericBeanDefinition
    • Root和Child是早期使用的,从spring2.5以后统一用Geniric

    此外还有一个封装类:BeanDefinitionHolder

    public class BeanDefinitionHolder implements BeanMetadataElement {
    
    	private final BeanDefinition beanDefinition;
    
    	private final String beanName;
    
    	@Nullable
    	private final String[] aliases;
    
        ...
    
    }
    
    • 扩展别名的时候会用到

    • 这一节,我们先对整体的beanDefinition家族有个了解,后面讲源码的时候会用到。

    • 目录:
      springboot源码解析-管中窥豹系列

     丰极

    欢迎关注微信公众号:丰极,更多技术学习分享。

    bk