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取信息的。
大部分的信息,都在AbstractBeanDefinition中定义,我们看看他的定义信息。
@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;