spring學習之源碼分析--BeanDefinition

BeanDefinition

BeanDefinition是一個接口,提供了beanClassName、scope、lazyInit等咱們定義的bean的屬性。從下面的結構圖能夠看出,有一個抽象子類AbstractBeanDefinition以及有三種類型的子類,包括GenericBeanDefinition(AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition)、ChildBeanDefinition和RootBeanDefinition。
RootBeanDefinition是最經常使用的實現類,
ChildBeanDefinition,若是有子bean的話,用這個。
GenericBeanDefinition是用於文件配置的bean定義。AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition在AnnotationConfigApplicationContext中,分別在register和scan方法有體現到。
spring經過BeanDefinition把每一個bean的信息,註冊到容器的beanDefinitionMap中,後續對bean的操做就是從這個map取信息的。spring

結構圖

image.png

AbstractBeanDefinition

大部分的信息,都在AbstractBeanDefinition中定義,咱們看看他的定義信息。segmentfault

@Nullable
// bean的class
private volatile Object beanClass;

@Nullable
// bean的做用範圍
private String scope = SCOPE_DEFAULT;
// 是不是抽象的
private boolean abstractFlag = false;
// 是否延遲加載
private boolean lazyInit = false;
// 自動注入的類型
private int autowireMode = AUTOWIRE_NO;
// 依賴檢查
private int dependencyCheck = DEPENDENCY_CHECK_NONE;

@Nullable
// 當前bean依賴了哪些bean
private String[] dependsOn;
// 若是設置false,那自動裝配的時候,就不考慮這個bean
private boolean autowireCandidate = true;
// 當出現多個bean候選的時候,若是爲true,則默認爲首選的
private boolean primary = false;
// 用於記錄qualifier
private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>();

@Nullable
private Supplier<?> instanceSupplier;
// 容許訪問非公開的構造強和方法
private boolean nonPublicAccessAllowed = true;
// 是否以寬鬆的模式解析構造函數
private boolean lenientConstructorResolution = true;

@Nullable
// 對應bean屬性的factory-bean,能夠查看spring學習之方法注入的內容
private String factoryBeanName;

@Nullable
// 對應bean屬性的factory-method
private String factoryMethodName;

@Nullable
// 構造函數的注入屬性
private ConstructorArgumentValues constructorArgumentValues;

@Nullable
// 普通屬性集合
private MutablePropertyValues propertyValues;

@Nullable
// 方法重寫的持有者 ,記錄 Lookup-method 、 replaced-method 元索
private MethodOverrides methodOverrides;

@Nullable
// 初始化方法,對應bean屬性的init-method
private String initMethodName;

@Nullable
// 銷燬方法,對應bean屬性的destroy-method
private String destroyMethodName;

private boolean enforceInitMethod = true;

private boolean enforceDestroyMethod = true;
// 建立aop的時候爲true
private boolean synthetic = false;
// 定義bean的應用。ROLE_APPLICATION:用戶,ROLE_SUPPORT:徹底內部使用,與用戶無關,ROLE_INFRASTRUCTURE其餘複雜的配置。
private int role = BeanDefinition.ROLE_APPLICATION;

@Nullable
// bean的描述
private String description;

@Nullable
// bean的資源
private Resource resource;
相關文章
相關標籤/搜索