目录
2、AttributeAccessor, BeanMetadataElement接口
你会发现很多框架都是,先声明一个接口,以这个接口作为入口,去实现一个功能模块,所以这是经验。
1、BeanDefinition接口
我们一步一步捋,不急,先看BeanDefinition接口,继承了两个接口,那我们先看这两个接口是什么功能的入口(看2节)。
看完第2节后回过来,BeanDefinition接口的作用:用户定义的bean,只是用户角度的,那么如果spring要用的话,就需要对bean进行再一次的封装,比如除了保留bean的基本属性信息外,还会有继承关系、依赖关系等等信息,这样才是spring角度。具体的bean有哪些属性,请查看博主的另一篇文章:https://blog.csdn.net/dgh112233/article/details/102865981
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
String SCOPE_SINGLETON = "singleton"; //单例模式
String SCOPE_PROTOTYPE = "prototype"; //原型模式(就是正常情况下的)
//此bean的角色
int ROLE_APPLICATION = 0; //表示这个bean是用户定义的
int ROLE_SUPPORT = 1; //表示这个bean是第三方插件或工具的
int ROLE_INFRASTRUCTURE = 2; //表示这个bean是spring内部自己的
//设置or获取此bean的父bean的名字
void setParentName(@Nullable String var1);
@Nullable
String getParentName();
//设置or获取此bean的类名
void setBeanClassName(@Nullable String var1);
@Nullable
String getBeanClassName();
//设置or获取此bean的模式(单例模式还是原型模式)
void setScope(@Nullable String var1);
@Nullable
String getScope();
//设置or获取此bean的延迟初始化属性(true,false)
void setLazyInit(boolean var1);
boolean isLazyInit();
//设置or获取依赖
void setDependsOn(@Nullable String... var1);
@Nullable
String[] getDependsOn();
//设置or获取此bean的是否接受被自动装配(true, false)
void setAutowireCandidate(boolean var1);
boolean isAutowireCandidate();
//设置or获取是否是首要(true,false)
void setPrimary(boolean var1);
boolean isPrimary();
//设置or获取工厂bean的名字
void setFactoryBeanName(@Nullable String var1);
@Nullable
String getFactoryBeanName();
//设置or 获取工厂bean里的生成方法名
void setFactoryMethodName(@Nullable String var1);
@Nullable
String getFactoryMethodName();
//获取构造函数的所有参数值
ConstructorArgumentValues getConstructorArgumentValues();
//判断构造函数参数是否为空
default boolean hasConstructorArgumentValues() {
return !this.getConstructorArgumentValues().isEmpty();
}
//获取所有的property
MutablePropertyValues getPropertyValues();
default boolean hasPropertyValues() {
return !this.getPropertyValues().isEmpty();
}
//设置or获取初始化方法名
void setInitMethodName(@Nullable String var1);
@Nullable
String getInitMethodName();
//设置or获取销毁方法名
void setDestroyMethodName(@Nullable String var1);
@Nullable
String getDestroyMethodName();
//设置角色,就是前面的三个整数(0,1,2),用户定义、第三方的、spring内部的
void setRole(int var1);
int getRole();
//设置or获取此bean的描述信息
void setDescription(@Nullable String var1);
@Nullable
String getDescription();
//判断此bean是否是单例、原型、抽象的
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
//获取资源描述,这个资源文件
@Nullable
String getResourceDescription();
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
2、AttributeAccessor, BeanMetadataElement接口
AttributeAccessor接口是用于存储属性的(具体可以看它的实现类,这里就不介绍了),以键值对的形式存储,LinkedHashMap<String, Object>队列存储键值对,同时提供操作队列的方法。
public interface AttributeAccessor {
//修改或者添加键值对
void setAttribute(String var1, @Nullable Object var2);
//根据键,获取值
@Nullable
Object getAttribute(String var1);
//删除键值对
@Nullable
Object removeAttribute(String var1);
//判断LinkedHashMap<String, Object>队列中是否有此键
boolean hasAttribute(String var1);
//返回队列中所有的键
String[] attributeNames();
}
BeanMetadataElement 接口用于获取配置文件,getSource()这个方法一看就是获取资源的,拿到配置文件,我们才能获取配置中的bean等信息。
public interface BeanMetadataElement {
@Nullable
Object getSource(); //获取资源文件(包括.properties、.xml等等文件)
}
是不是有点什么感觉了,拿到配置文件,解析其中的具体配置(各种参数、属性等等),然后解析出来存哪呢?就存在LinkedHashMap<String, Object> attribute 里面。看看下面这个图:
仔细看看继承关系以及命名,就可以看出上面两个接口的相互关联配合的。LinkedHashMap<String, Object> attribute 是个存储队列,声明在AttributeAccessorSupport类里面。
因此,此处可以展示出:BeanDefinition包括了两个功能:获取配置资源文件、解析文件中的属性并存储。