springboot源码解析-管中窥豹系列之BeanDefinition(八)
2021-02-08 17:55
851 查看
一、前言
- 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家族有个了解,后面讲源码的时候会用到。
欢迎关注微信公众号:丰极,更多技术学习分享。
相关文章推荐
- SpringBoot源码分析之BeanDefinitionLoader注册主Configuration的Java配置类
- 死磕Spring系列之二,bean标签的解析和BeanDefinition的注册
- springboot源码解析-管中窥豹系列之web服务器(七)
- spring源码分析系列2:Bean与BeanDefinition关系
- Spring源码学习--Spring配置文件解析BeanDefinitionReader(二)
- Spring 3.2 源码解析 -- XML bean 元素到 BeanDefinition 解析过程
- Spring 3.2 源码解析 -- XML bean 元素到 BeanDefinition 解析过程
- Spring源码学习--Spring配置文件解析BeanDefinitionDocumentReader(三)
- Spring源码解析之BeanDefinition(二)
- Spring源码阅读之IoC容器初始化2 -- BeanDefinition载入与解析
- Spring源码解析-BeanDefinition在IOC容器中的注册(三)
- spring系统架构源码解析BeanDefinition②
- 解析Spring源码(8)--BeanDefinitionParserDelegate
- Spring源码解析之BeanDefinition
- Ioc容器beanDefinition-Spring 源码系列(1)
- Spring 源码解析之BeanDefinition接口
- Spring源码分析-BeanDefinition加载、解析和注册
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【I】
- 辛星解析Spring3.2源码第二篇:BeanDefinitionReaderUtils
- 死磕Spring系列之二,bean标签的解析和BeanDefinition的注册