本文次要探讨什么是 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();    }    void setInitMethodName(@Nullable String initMethodName);    @Nullable    String getInitMethodName();    void setDestroyMethodName(@Nullable String destroyMethodName);    @Nullable    String getDestroyMethodName();    void setRole(int role);    int getRole();    void setDescription(@Nullable String description);    @Nullable    String getDescription();    ResolvableType getResolvableType();    boolean isSingleton();    boolean isPrototype();    boolean isAbstract();    @Nullable    String getResourceDescription();    @Nullable    BeanDefinition getOriginatingBeanDefinition();}

能够看到 BeanDefinition 是一个接口,它继承了 AttributeAccessor 和 BeanMetadataElement,其中 AttributeAccessor 的源码如下:

public interface AttributeAccessor {    void setAttribute(String name, @Nullable Object value);    @Nullable    Object getAttribute(String name);    @SuppressWarnings("unchecked")    default <T> T computeAttribute(String name, Function<String, T> computeFunction) {        Assert.notNull(name, "Name must not be null");        Assert.notNull(computeFunction, "Compute function must not be null");        Object value = getAttribute(name);        if (value == null) {            value = computeFunction.apply(name);            Assert.state(value != null,                    () -> String.format("Compute function must not return null for attribute named '%s'", name));            setAttribute(name, value);        }        return (T) value;    }    @Nullable    Object removeAttribute(String name);    boolean hasAttribute(String name);    String[] attributeNames();}

AttributeAccessor 次要提供了拜访和批改属性的办法。

须要留神的是,这里的属性是额定加给 BeanDefinition 的属性,而不是它所代表的对象自身的属性。

BeanMetadataElement 的源码如下:

public interface BeanMetadataElement {    @Nullable    default Object getSource() {        return null;    }}

BeanMetadataElement 只提供了一个办法,它是用来获取 Bean 元数据的配置源的(个别指向 Bean 对象的 class 文件的磁盘目录)。

理解完这两个接口,咱们再看回到 BeanDefinition 的源码,其中蕴含了几个动态变量:

    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;    int ROLE_APPLICATION = 0;    int ROLE_SUPPORT = 1;    int ROLE_INFRASTRUCTURE = 2;

SCOPE_SINGLETON、SCOPE_PROTOTYPE 用于示意对象是单例还是多例的,ROLE_ 结尾的几个常量跟 ComponentDefinition 无关,具体的作用在此不做剖析,有趣味的读者能够自行钻研。

接下来,咱们能够看到上面的办法,这些办法跟咱们如何定义这个 BeanDefinition 无关,咱们后面讲到的用来定义 Bean 个性的一些内容,如:@Scope、@Lazy、@DependsOn、@Primary、initMethod、destroyMethod、是否是候选类等,在这里都能够看到。

    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 setInitMethodName(@Nullable String initMethodName);    @Nullable    String getInitMethodName();    void setDestroyMethodName(@Nullable String destroyMethodName);    @Nullable    String getDestroyMethodName();    boolean isSingleton();    boolean isPrototype();

再接着,咱们看到上面的办法,基本上是一些辅助性办法和对 Bean 对象自身的根本内容进行治理的办法(如:对类名、构造函数参数值、属性值等进行治理的办法)。

    void setParentName(@Nullable String parentName);    @Nullable    String getParentName();    void setBeanClassName(@Nullable String beanClassName);    @Nullable    String getBeanClassName();    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();    }    void setDescription(@Nullable String description);    @Nullable    String getDescription();    void setRole(int role);    int getRole();    ResolvableType getResolvableType();    boolean isAbstract();    @Nullable    String getResourceDescription();    @Nullable    BeanDefinition getOriginatingBeanDefinition();

总结

本文,咱们简略介绍了 BeanDefinition 的根本内容,下一篇文章,咱们将探讨它是如何起作用的。