九、解析bean标签BeanDefinition

解析bean标签BeanDefinition

bean标签的所有子元素在BeanDefinition对象中都有与之相对应的属性。

BeanDefinition

BeanDefinition是一个接口,描述了Bean实例的定义。

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
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;

void setParentName(@Nullable String parentName);
@Nullable
String getParentName();

void setBeanClassName(@Nullable String beanClassName);
@Nullable
String getBeanClassName();

void setScope(@Nullable String scope);
@Nullable
String getScope();

void setLazyInit(boolean lazyInit);
boolean isLazyInit();

void setDependsOn(@Nullable String... dependsOn);
@Nullable
String[] getDependsOn();

void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();

void setPrimary(boolean primary);
boolean isPrimary();

void setFactoryBeanName(@Nullable String factoryBeanName);
@Nullable
String getFactoryBeanName();

void setFactoryMethodName(@Nullable String factoryMethodName);
@Nullable
String getFactoryMethodName();

ConstructorArgumentValues getConstructorArgumentValues();
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}

MutablePropertyValues getPropertyValues();
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}

void setInitMethodName(@Nullable String initMethodName);
@Nullable
String getInitMethodName();

void setDestroyMethodName(@Nullable String destroyMethodName);
@Nullable
String getDestroyMethodName();

void setRole(int role);
int getRole();

void setDescription(@Nullable String description);
@Nullable
String getDescription();

ResolvableType getResolvableType();

boolean isSingleton();

boolean isPrototype();

boolean isAbstract();

@Nullable
String getResourceDescription();

@Nullable
BeanDefinition getOriginatingBeanDefinition();

}

beandefinition父类子类结构图

BeanDefinition的父类

如上可以看出BeanDefinition继承自AttributeAccessorBeanMetadataElement

AttributeAccessor

该接口定义了与其他对象的元数据进行连接和访问的约定,即对属性的获取、设置、删除:

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
public interface AttributeAccessor {
void setAttribute(String name, @Nullable Object value);

@Nullable
Object getAttribute(String name);

@SuppressWarnings("unchecked")
default <T> T computeAttribute(String name, Function<String, T> computeFunction) {
Assert.notNull(name, "Name must not be null");
Assert.notNull(computeFunction, "Compute function must not be null");
Object value = getAttribute(name);
if (value == null) {
value = computeFunction.apply(name);
Assert.state(value != null,
() -> String.format("Compute function must not return null for attribute named '%s'", name));
setAttribute(name, value);
}
return (T) value;
}

@Nullable
Object removeAttribute(String name);

boolean hasAttribute(String name);

String[] attributeNames();

}
BeanMetadataElement
1
2
3
4
5
6
7
public interface BeanMetadataElement {
//返回此元数据元素的配置源,可能为null
@Nullable
default Object getSource() {
return null;
}
}
BeanDefinition的子类

三个常用的子类:

package org.springframework.beans.factory.support.RootBeanDefinition

package org.springframework.beans.factory.support.ChildBeanDefinition

package org.springframework.beans.factory.support.RootBeanDefinition

如果配置文件中定义了父 bean 和 子 bean ,则父 bean 用 RootBeanDefinition 表示,子 bean 用 ChildBeanDefinition 表示,而没有父 bean 的就使用RootBeanDefinition 表示。

解析bean标签

createBeanDefinition()方法

BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, String beanName, BeanDefinition containingBean) 方法中进行bean标签解析的过程中,内部调用了该方法。

BeanDefinitionParserDelegate.createBeanDefinition()返回AbstractBeanDefinition对象,方法内部调用的BeanDefinitionReaderUtils.createBeanDefinition()

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
protected AbstractBeanDefinition createBeanDefinition(@Nullable String className, @Nullable String parentName)
throws ClassNotFoundException {

return BeanDefinitionReaderUtils.createBeanDefinition(
parentName, className, this.readerContext.getBeanClassLoader());
}

//该方法主要是,创建 GenericBeanDefinition 对象,并设置 parentName、className、beanClass 属性。
public static AbstractBeanDefinition createBeanDefinition(@Nullable String parentName, @Nullable String className, @Nullable ClassLoader classLoader) throws ClassNotFoundException {

// 创建 GenericBeanDefinition 对象
GenericBeanDefinition bd = new GenericBeanDefinition();
// 设置 parentName
bd.setParentName(parentName);
if (className != null) {
if (classLoader != null) {
// 如果有给定的classLoader,设置 beanClass
bd.setBeanClass(ClassUtils.forName(className, classLoader));
}
else {
// 设置 beanClassName
bd.setBeanClassName(className);
}
}
return bd;
}
parseBeanDefinitionAttributes()方法

执行完createBeanDefinition()方法返回AbstractBeanDefinition对象后,进而执行该方法进行bean的属性设置。

BeanDefinitionParserDelegate.parseBeanDefinitionAttributes()

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
public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName,
@Nullable BeanDefinition containingBean, AbstractBeanDefinition bd) {
// 解析 scope 属性
if (ele.hasAttribute(SINGLETON_ATTRIBUTE)) {
error("Old 1.x 'singleton' attribute in use - upgrade to 'scope' declaration", ele);
}
else if (ele.hasAttribute(SCOPE_ATTRIBUTE)) {
bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE));
}
else if (containingBean != null) {
bd.setScope(containingBean.getScope());
}

// 解析 abstract 属性
if (ele.hasAttribute(ABSTRACT_ATTRIBUTE)) {
bd.setAbstract(TRUE_VALUE.equals(ele.getAttribute(ABSTRACT_ATTRIBUTE)));
}

// 解析 lazy-init 属性
String lazyInit = ele.getAttribute(LAZY_INIT_ATTRIBUTE);
if (isDefaultValue(lazyInit)) {
lazyInit = this.defaults.getLazyInit();
}
bd.setLazyInit(TRUE_VALUE.equals(lazyInit));

// 解析 autowire 属性
String autowire = ele.getAttribute(AUTOWIRE_ATTRIBUTE);
bd.setAutowireMode(getAutowireMode(autowire));

// 解析 depends-on 属性
if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) {
String dependsOn = ele.getAttribute(DEPENDS_ON_ATTRIBUTE);
bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS));
}

// 解析 autowire-candidate 属性
String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
if (isDefaultValue(autowireCandidate)) {
String candidatePattern = this.defaults.getAutowireCandidates();
if (candidatePattern != null) {
String[] patterns = StringUtils.commaDelimitedListToStringArray(candidatePattern);
bd.setAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName));
}
}
else {
bd.setAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));
}

// 解析 primary 标签
if (ele.hasAttribute(PRIMARY_ATTRIBUTE)) {
bd.setPrimary(TRUE_VALUE.equals(ele.getAttribute(PRIMARY_ATTRIBUTE)));
}

// 解析 init-method 属性
if (ele.hasAttribute(INIT_METHOD_ATTRIBUTE)) {
String initMethodName = ele.getAttribute(INIT_METHOD_ATTRIBUTE);
bd.setInitMethodName(initMethodName);
}
else if (this.defaults.getInitMethod() != null) {
bd.setInitMethodName(this.defaults.getInitMethod());
bd.setEnforceInitMethod(false);
}

// 解析 destroy-method 属性
if (ele.hasAttribute(DESTROY_METHOD_ATTRIBUTE)) {
String destroyMethodName = ele.getAttribute(DESTROY_METHOD_ATTRIBUTE);
bd.setDestroyMethodName(destroyMethodName);
}
else if (this.defaults.getDestroyMethod() != null) {
bd.setDestroyMethodName(this.defaults.getDestroyMethod());
bd.setEnforceDestroyMethod(false);
}

// 解析 factory-method 属性
if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) {
bd.setFactoryMethodName(ele.getAttribute(FACTORY_METHOD_ATTRIBUTE));
}
if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) {
bd.setFactoryBeanName(ele.getAttribute(FACTORY_BEAN_ATTRIBUTE));
}

return bd;
}

BeanDefinition解析的整体流程

下边四篇进行具体分析。

解析 BeanDefinition 的入口在DefaultBeanDefinitionDocumentReader的.parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) 方法。该方法会根据命令空间来判断标签是默认标签还是自定义标签,其中:

  • 默认标签,由 parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) 方法来实现
  • 自定义标签,由 BeanDefinitionParserDelegate 的 parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) 方法来实现。

在默认标签解析中,会根据标签名称的不同进行 importaliasbeanbeans 四大标签进行处理。其中 bean 标签的解析为核心,它由 processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) 方法实现。

processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) 方法,开始进入解析核心工作,分为三步:

  1. 解析默认标签的默认标签:BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, ...) 方法。该方法会依次解析 bean 标签的属性、各个子元素,解析完成后返回一个 GenericBeanDefinition 实例对象。
  2. 解析默认标签下的自定义标签:BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder definitionHolder) 方法。
  3. 注册解析的 BeanDefinition:BeanDefinitionReaderUtils#registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) 方法。

九、解析bean标签BeanDefinition
http://www.muzili.ren/2022/06/11/解析bean标签BeanDefinition/
作者
jievhaha
发布于
2022年6月11日
许可协议