一、前言
- Springboot 源码解析是一件大工程,逐行逐句的去钻研代码,会很干燥,也不容易坚持下去。
- 咱们不谋求大而全,而是试着每次去钻研一个小知识点,最终聚沙成塔,这就是咱们的 springboot 源码管中窥豹系列。
二、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 关上图属性看看:
- 继承了 AttributeAccessor,领有获取属性的能力
- 继承了 BeanMetadataElement,领有了获取源的能力
- 定义了各种接口,用来形容一个 bean
咱们在看看它的实现类:
- 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 家族有个理解,前面讲源码的时候会用到。
欢送关注微信公众号:丰极,更多技术学习分享。