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取信息的。

结构图

image.png

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;

大军
847 声望183 粉丝

学而不思则罔,思而不学则殆