spring学习之源码分析–BeanDefinition

BeanDefinition

BeanDefinition是一个接口,提供了beanClassName、scope、lazyInit等我们定义的bean的属性。从下面的结构图可以看出,有一个抽象子类AbstractBeanDefinition以及有三种类型的子类,包括GenericBeanDefinition(AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition)、ChildBeanDefinition和RootBeanDefinition。

RootBeanDefinition是最常用的实现类,

ChildBeanDefinition,如果有子bean的话,用这个。

GenericBeanDefinition是用于文件配置的bean定义。AnnotatedGenericBeanDefinition和ScannedGenericBeanDefinition在 AnnotationConfigApplicationContext 中,分别在register和scan方法有体现到。

spring通过BeanDefinition把每个bean的信息,注册到容器的beanDefinitionMap中,后续对bean的操作就是从这个map取信息的。

结构图

spring学习之源码分析--BeanDefinition

AbstractBeanDefinition

大部分的信息,都在AbstractBeanDefinition中定义,我们看看他的定义信息。

@Nullable
// bean的class
private volatile Object beanClass;

@Nullable
// bean的作用范围
private String scope = SCOPE_DEFAULT;
// 是否是抽象的
private boolean abstractFlag = false;
// 是否延迟加载
private boolean lazyInit = false;
// 自动注入的类型
private int autowireMode = AUTOWIRE_NO;
// 依赖检查
private int dependencyCheck = DEPENDENCY_CHECK_NONE;

@Nullable
// 当前bean依赖了哪些bean
private String[] dependsOn;
// 如果设置false,那自动装配的时候,就不考虑这个bean
private boolean autowireCandidate = true;
// 当出现多个bean候选的时候,如果为true,则默认为首选的
private boolean primary = false;
// 用于记录qualifier
private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>();

@Nullable
private Supplier<?> instanceSupplier;
// 允许访问非公开的构造强和方法
private boolean nonPublicAccessAllowed = true;
// 是否以宽松的模式解析构造函数
private boolean lenientConstructorResolution = true;

@Nullable
// 对应bean属性的factory-bean,可以查看spring学习之方法注入的内容
private String factoryBeanName;

@Nullable
// 对应bean属性的factory-method
private String factoryMethodName;

@Nullable
// 构造函数的注入属性
private ConstructorArgumentValues constructorArgumentValues;

@Nullable
// 普通属性集合
private MutablePropertyValues propertyValues;

@Nullable
// 方法重写的持有者 ,记录 Lookup-method 、 replaced-method 元索
private MethodOverrides methodOverrides;

@Nullable
// 初始化方法,对应bean属性的init-method
private String initMethodName;

@Nullable
// 销毁方法,对应bean属性的destroy-method
private String destroyMethodName;

private boolean enforceInitMethod = true;

private boolean enforceDestroyMethod = true;
// 创建aop的时候为true
private boolean synthetic = false;
// 定义bean的应用。ROLE_APPLICATION:用户,ROLE_SUPPORT:完全内部使用,与用户无关,ROLE_INFRASTRUCTURE其他复杂的配置。
private int role = BeanDefinition.ROLE_APPLICATION;

@Nullable
// bean的描述
private String description;

@Nullable
// bean的资源
private Resource resource;

原文 

https://segmentfault.com/a/1190000020978133

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » spring学习之源码分析–BeanDefinition

赞 (0)
分享到:更多 ()

评论 0

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