乐趣区

关于java:springboot源码解析管中窥豹系列之BeanDefinition八

一、前言

  • 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 关上图属性看看:

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

咱们在看看它的实现类:

  • 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 家族有个理解,前面讲源码的时候会用到。

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

退出移动版