zhangbin1989
# 一、前言
- Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去。
- 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot源码管中窥豹系列。

![ 简介 ](https://zhangbin1989.gitee.io/blog/picture/zb0018_springsour/springboot_source_0.png)

# 二、BeanDefinition

- spring帮我们管理bean,就是通过BeanDefinition实现的,要深研源码,就绕不开BeanDefinition
- 我们通过源码来看看BeanDefinition到底做了什么

# 三、源码分析

我们先看看这个类:BeanDefinition

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();
}


boolean isSingleton();


boolean isPrototype();


boolean isAbstract();


int getRole();


@Nullable
String getDescription();

@Nullable
String getResourceDescription();

@Nullable
BeanDefinition getOriginatingBeanDefinition();

}


定义了一个bean的各种属性:
- 父类:setParentName
- class名称:setBeanClassName
- 作用域:setScope
- 懒加载:setLazyInit
- 依赖: setDependsOn
- 被依赖: setAutowireCandidate
- 自动加载:setPrimary
- 工厂bean: setFactoryBeanName
- 工厂方法:setFactoryMethodName
- 单例:isSingleton
- 多例:isPrototype
- 静态:isAbstract


我们用idea打开图属性看看:

![ beanDefinition ](https://zhangbin1989.gitee.io/blog/picture/zb0018_springsour/beanDefinition.png)

- 继承了AttributeAccessor,拥有获取属性的能力
- 继承了BeanMetadataElement,拥有了获取源的能力
- 定义了各种接口,用来描述一个bean

我们在看看它的实现类:

![ beanDefinition ](https://zhangbin1989.gitee.io/blog/picture/zb0018_springsour/beanDefinition2.png)

- spring的常用方式:定义接口,写抽象类实现接口(核心功能写在这里),各种实现
- 接口:BeanDefinition
- 抽象类: AbstractBeanDefinition
- 实现类:RootBeanDefinition,ChildBeanDefinition,GenericBeanDefinition,AnnotatedGenericBeanDefinition,ScannedGenericBeanDefinition
- Root和Child是早期使用的,从spring2.5以后统一用Geniric

此外还有一个封装类:BeanDefinitionHolder

public class BeanDefinitionHolder implements BeanMetadataElement {

private final BeanDefinition beanDefinition;

private final String beanName;

@Nullable
private final String[] aliases;

...

}

- 扩展别名的时候会用到

- 这一节,我们先对整体的beanDefinition家族有个了解,后面讲源码的时候会用到。


- 目录:
[springboot源码解析-管中窥豹系列](https://www.cnblogs.com/zhangbin1989/p/14379131.html)

![ 丰极 ](https://zhangbin1989.gitee.io/blog/picture/zb0000_common/qrcode.jpg)

欢迎关注微信公众号:丰极,更多技术学习分享。

相关文章: