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
大部分的信息,都在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;