0%

Spring源码学习-GenericBeanDefinition

前言:学习GenericBeanDefinition,有了AbstractBeanDefinition的基础后,这个就很简单

简介

类图如下

image-20200114235837644

GenericBeanDefinition是spring2.5版本后的 一站式Bean定义组件,其继承了AbstractBeanDefinition抽象类,bean的相关属性均是在了AbstractBeanDefinition定义,GenericBeanDefinition在继承的基础上重写了一定的方法,从而可以满足任何要求的Bean定义,读取xml或注解配置后生成bean的就是GenericBeanDefinition。

GenericBeanDefinition、RootBeanDefinition、ChildBeanDefinition这个类均能表示bean,其关系,个人理解就是普通人(通用bean)、父亲(Root bean)、孩子(child bean)的关系,都是人(bean),GenericBeanDefinition是通用的表示bean的一种方式,RootBeanDefinition、ChildBeanDefinition则是偏向于表示有父子关系的bean

源码分析

image-20200114235846438

首先GenericBeanDefinition非常简单,因为这里用到了继承机制,大部分的属性、方法都是在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
public class GenericBeanDefinition extends AbstractBeanDefinition {
/**
* 父bean名
*/
private String parentName;

/**
* 创建一个新的GenericBeanDefinition对象,调用父类构造方法初始化
*/
public GenericBeanDefinition() {
super();
}

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

/**
* 重写setParentName方法,设置父bean名
*/
@Override
public void setParentName(String parentName) {
this.parentName = parentName;
}

/**
* 重写getParentName方法,获取父bean名
*/
@Override
public String getParentName() {
return this.parentName;
}

/**
* 重写cloneBeanDefinition方法,深拷贝
*/
@Override
public AbstractBeanDefinition cloneBeanDefinition() {
return new GenericBeanDefinition(this);
}

/**
* 重写equals方法,比较内存地址
*/
@Override
public boolean equals(Object other) {
return (this == other || (other instanceof GenericBeanDefinition && super.equals(other)));
}

/**
* 重写toString方法
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder("Generic bean");
if (this.parentName != null) {
sb.append(" with parent '").append(this.parentName).append("'");
}
sb.append(": ").append(super.toString());
return sb.toString();
}

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