0%

Spring源码学习-ChildBeanDefinition

前言:学习ChildBeanDefinition

简介

类图

image-20200114235318220

ChildBeanDefinition继承了AbstractBeanDefinition抽象类,bean的相关属性均是在了AbstractBeanDefinition定义,GenericBeanDefinition在继承的基础上重写了一定的方法

ChildBeanDefinition用于定义子Bean信息,和RootBeanDefinition搭配即ChildBeanDefinition对RootBeanDefinition有一定的依赖关系。(功能和GenericBeanDefinition)

源码分析

image

源码很简单

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
public class ChildBeanDefinition extends AbstractBeanDefinition {
/**
* 父bean名
*/
private String parentName;

/**
* 创建一个新的ChildBeanDefinition对象,调用父类构造方法初始化并设置parentName
*/
public ChildBeanDefinition(String parentName) {
super();
this.parentName = parentName;
}

/**
* 创建新的GenericBeanDefinition对象,以MutablePropertyValues初始化(MutablePropertyValues就是配置文件中的一系列property标签的解析,储存了bean属性)并设置parentName
*/
public ChildBeanDefinition(String parentName, MutablePropertyValues pvs) {
super(null, pvs);
this.parentName = parentName;
}

/**
* 同上了,增加以ConstructorArgumentValues(配置文件中的一系列constructor-arg标签的解析)的初始化
*/
public ChildBeanDefinition(
String parentName, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {

super(cargs, pvs);
this.parentName = parentName;
}

/**
* 同上,新增beanClass(Class类型)
*/
public ChildBeanDefinition(
String parentName, Class<?> beanClass, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {

super(cargs, pvs);
this.parentName = parentName;
setBeanClass(beanClass);
}

/**
* 同上,beanClass(Class类型)变为beanClassName(String类型)
*/
public ChildBeanDefinition(
String parentName, String beanClassName, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {

super(cargs, pvs);
this.parentName = parentName;
setBeanClassName(beanClassName);
}

/**
* 以给定的ChildBeanDefinition,创建新的ChildBeanDefinition对象
*/
public ChildBeanDefinition(ChildBeanDefinition original) {
super(original);
}

/**
* 设置parentName
*/
@Override
public void setParentName(String parentName) {
this.parentName = parentName;
}

/**
* 获取parentName
*/
@Override
public String getParentName() {
return this.parentName;
}

/**
* 校验,用ChildBeanDefinition所描述的bean必须要有父bean
*/
@Override
public void validate() throws BeanDefinitionValidationException {
super.validate();
if (this.parentName == null) {
throw new BeanDefinitionValidationException("'parentName' must be set in ChildBeanDefinition");
}
}

/**
* 克隆,深拷贝
*/
@Override
public AbstractBeanDefinition cloneBeanDefinition() {
return new ChildBeanDefinition(this);
}

/**
* 重写equals方法,主要就是比较内存地址,如果不同再根据其具体类的类型来比较
*/
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof ChildBeanDefinition)) {
return false;
}
ChildBeanDefinition that = (ChildBeanDefinition) other;
return (ObjectUtils.nullSafeEquals(this.parentName, that.parentName) && super.equals(other));
}

/**
* 重写hashCode方法
*/
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.parentName) * 29 + super.hashCode();
}

/**
* 重写toString方法
*/
@Override
public String toString() {
return "Child bean with parent '" + this.parentName + "': " + super.toString();
}

}
-------------本文结束感谢您的阅读-------------