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;