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 取信息的。
结构图
AbstractBeanDefinition
大部分的信息,都在 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;