BeanDefinition源碼分析

BeanDefinition

摘要

BeanDefinition是spring ioc的核心部分,可以說spring管理的幾乎所有bean都是BeanDefinition的子類。其包含的實例化bean需要的全部信息,例如類名、方法、父類信息、scope、各類注解等

類圖

BeanDefinition.png

源碼分析

可以看到BeanDefinition繼承了兩個接口

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

public interface AttributeAccessor {

    void setAttribute(String name, @Nullable Object value);
    @Nullable
    Object getAttribute(String name);
    @Nullable
    Object removeAttribute(String name);
    boolean hasAttribute(String name);
    String[] attributeNames();

AttributeAccessor 主要用于操作對象的內(nèi)部屬性

/**
 * Interface to be implemented by bean metadata elements
 * that carry a configuration source object.
 */
public interface BeanMetadataElement {

    @Nullable
    Object getSource();
}

BeanMetadataElement用于獲取對象的元數(shù)據(jù)配置源信息

BeanDefinition 屬性、方法列表

package org.springframework.beans.factory.config;

import xxx;

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

    //scope: "singleton"標(biāo)示
    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    //scope: "prototype"標(biāo)示
    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    //表示用戶自定義bean
    int ROLE_APPLICATION = 0;
    //表示通過外部配置加載的bean
    int ROLE_SUPPORT = 1;
    //表示是spring框架的bean
    int ROLE_INFRASTRUCTURE = 2;
    //父類bean的類名
    String getParentName();
    //當(dāng)前bean的名字
    void setBeanClassName(@Nullable String beanClassName);
    String getBeanClassName();
    //bean的scope
    void setScope(@Nullable String scope);
    String getScope();
    //bean是否是懶加載
    void setLazyInit(boolean lazyInit);
    boolean isLazyInit();
    //依賴bean列表
    String[] getDependsOn();
    //bean是否可以自動注入到其他bean中
    void setAutowireCandidate(boolean autowireCandidate);
    boolean isAutowireCandidate();
    //是否是優(yōu)先注入的bean,用于當(dāng)有多個實現(xiàn)bean時,優(yōu)先注入
    void setPrimary(boolean primary);
    boolean isPrimary();
    //bean的工廠類
    void setFactoryBeanName(@Nullable String factoryBeanName);
    String getFactoryBeanName();
    //bean的工廠方法
    void setFactoryMethodName(@Nullable String factoryMethodName);
    String getFactoryMethodName();
    //構(gòu)造方法的參數(shù)-值列表
    ConstructorArgumentValues getConstructorArgumentValues();
    default boolean hasConstructorArgumentValues() {
        return !getConstructorArgumentValues().isEmpty();
    }
    //屬性值列表
    MutablePropertyValues getPropertyValues();
    default boolean hasPropertyValues() {
        return !getPropertyValues().isEmpty();
    }
    //init方法名
    void setInitMethodName(@Nullable String initMethodName);
    String getInitMethodName();
    //Destroy方法名
    void setDestroyMethodName(@Nullable String destroyMethodName);
    String getDestroyMethodName();
    //ROLE_APPLICATION
    //ROLE_SUPPORT
    //ROLE_INFRASTRUCTURE
    void setRole(int role);
    int getRole();
    //自定義bean的description
    void setDescription(@Nullable String description);
    String getDescription();
    //scope
    boolean isSingleton();
    boolean isPrototype();
    //是否抽象類
    boolean isAbstract();
    //bean的資源描述
    String getResourceDescription();
    //返回原始的BeanDefinition,允許檢索裝飾的bean,返回用戶定義的原始bean
    BeanDefinition getOriginatingBeanDefinition();

}

常用的BeanDefinition實現(xiàn)類

GenericBeanDefinition

通用的BeanDefinition實現(xiàn),有兩個子類ScannedGenericBeanDefinition和AnnotatedGenericBeanDefinition


image.png
ScannedGenericBeanDefinition

實現(xiàn)了AnnotatedBeanDefinition,被ClassPathScanningCandidateComponentProvider. findCandidateComponents掃描出來的bean會被封裝為此類型,有@Component和@Component的派生注解會被封裝成此類型

AnnotatedGenericBeanDefinition

有@Configuration注解的類,會生成AnnotatedGenericBeanDefinition類型的Bean

ConfigurationClassBeanDefinition

在@Configuration注解的類中,使用@Bean注解實例化的Bean

RootBeanDefinition

通用的BeanDefinition,可單獨使用,一般也作為其他BeanDefinition的父類

ChildBeanDefinition

從RootBeanDefinition 繼承方法、參數(shù)、可重寫父類方法,需要配合RootBeanDefinition一起使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容