Spring源码之AbstractBeanDefinition属性

AbstractBeanDefinition

AbstractBeanDefinition实现了BeanDefinition接口,是最重要的Bean定义类。

AbstractBeanDefinition 常量属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**
* 默认scope
*/
public static final String SCOPE_DEFAULT = "";

/**
* 自动装配类型:不自动装配
*/
public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;

/**
* 自动装配类型:根据名称自动装配
*/
public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;

/**
* 自动装配类型:根据类型自动装配
*/
public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;

/**
* 自动装配类型:根据构造函数自动装配
*/
public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;

/**
* 自动装配类型:自动选择装配类型
*/
@Deprecated
public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;

/**
* 依赖检查:不检查
*/
public static final int DEPENDENCY_CHECK_NONE = 0;

/**
* 依赖检查:检查对象
*/
public static final int DEPENDENCY_CHECK_OBJECTS = 1;

/**
* 依赖检查:检查简单的属性
* 基本数据类型及其包装类型,枚举类型/CharSequence/Number/Date及其实现子类,URI,URL,Locale,Class等都被Spring认为是简单值类型
* BeanUtils.isSimpleProperty
*/
public static final int DEPENDENCY_CHECK_SIMPLE = 2;

/**
* 依赖检查:检查对象和简单属性
*/
public static final int DEPENDENCY_CHECK_ALL = 3;

/**
* 若Bean未指定销毁方法,容器应该尝试推断Bean的销毁方法的名字,目前来说,推断的销毁方法的名字一般为close或是shutdown(即未指定Bean的销毁方法,但是内部定义了名为close或是shutdown的方法,则容器推断其为销毁方法)
*/
public static final String INFER_METHOD = "(inferred)";

AbstractBeanDefinition 属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/**
* bean的类
*/
@Nullable
private volatile Object beanClass;
/**
* bean 对象的生存周期(作用域)singleton,prototype,request,session,global session
*/
@Nullable
private String scope = SCOPE_DEFAULT;
/**
* 是否是抽象类
*/
private boolean abstractFlag = false;
/**
* 是否懒加载
*/
private boolean lazyInit = false;
/**
* 自动装配类型
*/
private int autowireMode = AUTOWIRE_NO;
/**
* 依赖检查方式
*/
private int dependencyCheck = DEPENDENCY_CHECK_NONE;
/**
* 当前bean依赖的bean名称
*/
@Nullable
private String[] dependsOn;
/**
* 是否作为自动装配候选
* autowire-candidate属性设置为false,这样容器在查找自动装配对象时,
* 将不考虑该bean,即它不会被考虑作为其他bean自动装配的候选者,
* 但是该bean本身还是可以使用自动装配来注入其他bean的
*/
private boolean autowireCandidate = true;
/**
* 自动装配时出现多个bean候选者时,作为首选者
*/
private boolean primary = false;
/**
* 记录Qualifier,对应子元素qualifier
*/
private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>();
/**
* 为创建bean的实例指定一个回调,
* 作为声明式指定的工厂方法的替代方法。
* 如果设置了这样一个回调,它将覆盖任何其他构造函数
* 或工厂方法元数据。但是,bean属性的填充和
* 潜在的注释驱动的注入仍然会像往常一样应用
*/
@Nullable
private Supplier<?> instanceSupplier;
/**
* 是否允许访问非公开的构造器和方法
*/
private boolean nonPublicAccessAllowed = true;
/**
* 是否以一种宽松的模式解析构造函数,默认为true,
* 如果为false,则在以下情况
* interface ITest{}
* class ITestImpl implements ITest{};
* class Main {
* Main(ITest i) {}
* Main(ITestImpl i) {}
* }
* 抛出异常,因为Spring无法准确定位哪个构造函数程序设置
*/
private boolean lenientConstructorResolution = true;
/**
* 工厂bean名称
*/
@Nullable
private String factoryBeanName;
/**
* 工厂bean方法
*/
@Nullable
private String factoryMethodName;
/**
* 初始化参数
*/
@Nullable
private ConstructorArgumentValues constructorArgumentValues;
/**
* 对象的属性值
*/
@Nullable
private MutablePropertyValues propertyValues;

/**
* 方法重写的持有者,记录lookup-method、replaced-method元素
*/
@Nullable
private MethodOverrides methodOverrides;
/**
* bean 初始化后回调方法名称,对应bean属性init-method
*/
@Nullable
private String initMethodName;
/**
* bean 销毁前回调方法名称,对应bean属性destroy-method
*/
@Nullable
private String destroyMethodName;
/**
* 是否执行init-method
*/
private boolean enforceInitMethod = true;
/**
* 是否执行destroy-method
*/
private boolean enforceDestroyMethod = true;
/**
* 是否是用户定义的而不是应用程序本身定义的,创建AOP时候为true
* 是否是合成类(是不是应用自定义的,例如生成AOP代理时,会用到某些辅助类,这些辅助类不是应用自定义的,这个就是合成类)
* 是否是一个合成 BeanDefinition,
* // 合成 在这里的意思表示这不是一个应用开发人员自己定义的 BeanDefinition, 而是程序
* // 自己组装而成的一个 BeanDefinition, 例子 :
* // 1. 自动代理的helper bean,一个基础设施bean,因为使用<aop:config> 被自动合成创建;
* // 2. bean errorPageRegistrarBeanPostProcessor , Spring boot 自动配置针对Web错误页面的
* // 一个bean,这个bean不需要应用开发人员定义,而是框架根据上下文自动合成组装而成;
*/
private boolean synthetic = false;
/**
* bean 角色
* APPLICATION:用户,INFRASTRUCTURE:完全内部使用,与用户无关,SUPPORT:某些复杂配置的一部分
*/
private int role = BeanDefinition.ROLE_APPLICATION;
/**
* bean描述
*/
@Nullable
private String description;
/**
* 这个bean定义的资源
*/
@Nullable
private Resource resource;

实现类

  • ChildBeanDefinition
    通用BeanDefinition 实现类,引入了 parentName属性

  • GenericBeanDefinition
    通用BeanDefinition 实现类,引入了 parentName属性

  • AnnotatedGenericBeanDefinition
    基于注解的BeanDefinition实现类,继承GenericBeanDefinition,引入了AnnotationMetadata metadata,MethodMetadata factoryMethodMetadata 两个属性;

  • ScannedGenericBeanDefinition
    基于注解的BeanDefinition实现类,继承ScannedGenericBeanDefinition,引入了AnnotationMetadata metadata 属性;

  • RootBeanDefinition

  • ConfigurationClassBeanDefinition
    继承RootBeanDefinition,为静态内部类,引入了AnnotationMetadata metadata,MethodMetadata factoryMethodMetadata 两个属性;

  • ClassDerivedBeanDefinition
    继承RootBeanDefinition,为静态内部类

AbstractBeanDefinition属性信息可以分为一下几类

  • Bean描述相关信息(否是抽象类、是否单例,Bean所属的类)
  • Bean依赖信息(dependsOn)
  • 自动装配的信息
  • 生命周期相关信息(init、destroy,通过反射调用)
  • 来源信息(工厂方法名、工厂类名,有可能通过工厂FactoryBean创建)
  • 构造函数信息,Bean的属性以及对应的值(propertyValues,constructorArgumentValues)
  • 被IOC容器覆盖的方法(methodOverrides,@Lookup 注解是基于此实现,器初始化的时候会通过cglib字节码库动态生成一个子类,并且会覆盖父类的实现)