H5W3
当前位置:H5W3 > java > 正文

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

springboot源码解析-管中窥豹系列之BeanDefinition(八)

丰极发布于 今天 10:02

一、前言

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

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

二、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打开图属性看看:

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

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

我们在看看它的实现类:

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

  • 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家族有个了解,后面讲源码的时候会用到。

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

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

javaspring源码源码学习springboot
阅读 34发布于 今天 10:02
本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar

丰极
1 声望
0 粉丝

0 条评论
得票时间

avatar

丰极
1 声望
0 粉丝

宣传栏

一、前言

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

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

二、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打开图属性看看:

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

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

我们在看看它的实现类:

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

  • 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家族有个了解,后面讲源码的时候会用到。

【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

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

本文地址:H5W3 » 【Java】springboot源码解析-管中窥豹系列之BeanDefinition(八)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址