一、前言
- 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家族有个理解,前面讲源码的时候会用到。
欢送关注微信公众号:丰极,更多技术学习分享。