BeanDefinition
中存储着 Bean
的定义信息,它具有属性值、构造函数参数值以及具体实现 Bean
提供的进一步信息,在学习 Spring
的 Bean
初始化流程之前,还是非常有必要先了解一下 BeanDefinition
。
一、注册 Bean 示例
首先,本文先举一个使用 BeanDefinition
创建 Bean
的小例子:
import com.nineya.spring.entity.Post;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import java.util.ArrayList;
import java.util.List;
public class SpringMain {
public static void main(String[] args) {
// 创建bean工厂
DefaultListableBeanFactory context = new DefaultListableBeanFactory();
//构造bean定义
GenericBeanDefinition gbd = new GenericBeanDefinition();
gbd.setBeanClass(Post.class);
// 设置属性
List<PropertyValue> propertyValues = new ArrayList<>();
propertyValues.add(new PropertyValue("id", 123L));
propertyValues.add(new PropertyValue("title", "title"));
gbd.setPropertyValues(new MutablePropertyValues(propertyValues));
//注册到环境上下文
context.registerBeanDefinition("post", gbd);
// 通过class取得bean
Post post = context.getBean(Post.class);
System.out.println(post + " : " + post.hashCode());
// 通过名称取得bean
post = (Post) context.getBean("post");
System.out.println(post + " : " + post.hashCode());
}
}
执行结果输出:
Post(id=123, title=title, categories=null, tags=null, content=null) : 1339167804
Post(id=123, title=title, categories=null, tags=null, content=null) : 1339167804
二、GenericBeanDefinition 结构
GenericBeanDefinition
类继承关系图如下:
逐个对 GenericBeanDefinition
继承的类/接口进行分析:
BeanMetadataElement 接口: BeanMetadataElement
提供了获取数据源的方式,也就是可以指导 Bean
是来自哪个类,由携带配置源对象的 Bean
元数据元素实现的接口。
接口 | 说明 |
Object getSource() | 返回此元数据元素的配置源 |
AttributeAccessorSupport 抽象类: 支持 AttributeAccessor
属性存取接口,内部使用的 LinkedHashMap
,提供
所有方法的基本实现,由子类扩展。
接口 | 说明 |
void setAttribute(String name, @Nullable Object value) | 设置属性 |
Object getAttribute(String name) | 取得属性 |
Object removeAttribute(String name) | 删除并返回属性 |
boolean hasAttribute(String name) | 判断属性是否存在 |
String[] attributeNames() | 取得所有属性的名称 |
以上这两个接口的实现皆与 GenericBeanDefinition
无关联,这是公共的基础类。
BeanMetadataAttributeAccessor 类: 将元数据参数封装为 BeanMetadataAttribute
,用于 Bean
的元数据和属性上下文操作的实现类。
接口 | 说明 |
void setSource(@Nullable Object source) | 为这个元数据元素设置配置源 |
void addMetadataAttribute(BeanMetadataAttribute attribute) | 将给定的BeanMetadataAttribute添加到该访问器的属性集 |
BeanMetadataAttribute getMetadataAttribute(String name) | 在这个访问器的属性集中查找给定的BeanMetadataAttribute |
BeanDefinition 接口
接口 | 说明 |
void setParentName(@Nullable String parentName) | 设置此 |
String getParentName() | 返回此 |
void setBeanClassName(@Nullable String beanClassName) | 指定此 |
String getBeanClassName() | 返回此 |
void setScope(@Nullable String scope) | 重写此 |
String getScope() | 返回此 |
void setLazyInit(boolean lazyInit) | 设置该 |
boolean isLazyInit() | 返回该 |
void setDependsOn(@Nullable String… dependsOn) | 设置此 |
String[] getDependsOn() | 返回此 |
void setAutowireCandidate(boolean autowireCandidate) | 设置该 |
boolean isAutowireCandidate() | 返回该 |
void setPrimary(boolean primary) | 设置此 |
boolean isPrimary() | 返回此 |
void setFactoryBeanName(@Nullable String factoryBeanName) | 指定要使用的工厂 |
String getFactoryBeanName() | 返回工厂 |
void setFactoryMethodName(@Nullable String factoryMethodName) | 指定一个工厂方法,该方法将使用构造函数参数调用,如果没有指定参数,则不使用参数调用。该方法将在指定的工厂 |
String getFactoryMethodName() | 返回一个工厂方法 |
ConstructorArgumentValues getConstructorArgumentValues() | 返回此 |
boolean hasConstructorArgumentValues() | 判断此 |
MutablePropertyValues getPropertyValues() | 返回应用于 |
boolean hasPropertyValues() | 判断此 |
void setInitMethodName(@Nullable String initMethodName) | 设置初始化器方法的名称 |
String getInitMethodName() | 返回初始化方法的名称 |
void setDestroyMethodName(@Nullable String destroyMethodName) | 设置销毁方法的名称 |
String getDestroyMethodName() | 返回销毁方法的名称 |
void setRole(int role) | 为这个 |
int getRole() | 获取这个 |
void setDescription(@Nullable String description) | 设置此 |
String getDescription() | 取得此 |
ResolvableType getResolvableType() | 根据 |
boolean isSingleton() | 判断此 |
boolean isPrototype() | 判断此 |
boolean isAbstract() | 返回此 |
String getResourceDescription() | 返回此 |
BeanDefinition getOriginatingBeanDefinition() | 返回原始的 |
AbstractBeanDefinition 抽象类: AbstractBeanDefinition
是具体的、BeanDefinition
类的基类,分解出 GenericBeanDefinition
、RootBeanDefinition
和 ChildBeanDefinition
的公共属性和逻辑。
接口 | 说明 |
void overrideFrom(BeanDefinition other) | 使用给定 |
void applyDefaults(BeanDefinitionDefaults defaults) | 将提供的默认值应用到此 |
void setBeanClass(@Nullable Class<?> beanClass) | 为这个 |
Class<?> getBeanClass() throws IllegalStateException | 返回 |
boolean hasBeanClass() | 返回该定义是否指定了 |
Class<?> resolveBeanClass(@Nullable ClassLoader classLoader) | 确定被包装bean的类,如果需要,从指定的类名解析它 |
void setAbstract(boolean abstractFlag) | 默认为“false”。指定 true 告诉 |
Boolean getLazyInit() | 返回该 |
void setAutowireMode(int autowireMode) | 设置自动装配模式。这决定是否会发生 |
int getAutowireMode() | 返回 |
int getResolvedAutowireMode() | 返回已解析的自动装配代码 |
void setDependencyCheck(int dependencyCheck) | 设置依赖项检查代码 |
int getDependencyCheck() | 返回依赖项检查代码 |
addQualifier(AutowireCandidateQualifier qualifier) | 注册一个用于自动装配候选解析的限定符,以限定符的类型名称为键值 |
boolean hasQualifier(String typeName) | 返回此 |
AutowireCandidateQualifier getQualifier(String typeName) | 返回映射到所提供类型名称的限定符 |
Set<AutowireCandidateQualifier> getQualifiers() | 返回所有已注册的限定符 |
void copyQualifiersFrom(AbstractBeanDefinition source) | 将所提供的 |
public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) | 指定用于创建 |
Supplier<?> getInstanceSupplier() | 返回用于创建 |
void setNonPublicAccessAllowed(boolean nonPublicAccessAllowed) | 指定是否允许访问非公共构造函数和方法,如果外部化元数据指向它们 |
boolean isNonPublicAccessAllowed() | 返回是否允许访问非公共构造函数和方法 |
void setLenientConstructorResolution(boolean lenientConstructorResolution) | 指定是否在宽限模式下解析构造函数 |
boolean isLenientConstructorResolution() | 返回以宽松模式还是严格模式解析构造函数 |
void setConstructorArgumentValues(ConstructorArgumentValues constructorArgumentValues) | 为这个 |
void setPropertyValues(MutablePropertyValues propertyValues) | 指定此 |
void setMethodOverrides(MethodOverrides methodOverrides) | 为 |
MethodOverrides getMethodOverrides() | 返回 |
boolean hasMethodOverrides() | 是否为此 |
void setEnforceInitMethod(boolean enforceInitMethod) | 指定配置的初始化方法是否为默认值 |
boolean isEnforceInitMethod() | 指示配置的初始化方法是否为默认值 |
void setEnforceDestroyMethod(boolean enforceDestroyMethod) | 设置配置的销毁方法是否为默认值 |
boolean isEnforceDestroyMethod() | 指定配置的销毁方法是否为默认值 |
void setSynthetic(boolean synthetic) | 设置这个 |
boolean isSynthetic() | 返回此 |
void setResource(@Nullable Resource resource) | 设置此 |
setResourceDescription(@Nullable String resourceDescription) | 设置此 |
void setOriginatingBeanDefinition(BeanDefinition originatingBd) | 如果有的话,设置原始的(例如装饰过的) |
void validate() throws BeanDefinitionValidationException | 验证这个 |
void prepareMethodOverrides() throws BeanDefinitionValidationException | 验证并准备为此 |
void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException | 验证并准备给定的方法重写。检查具有指定名称的方法是否存在,如果没有找到则将其标记为未重载 |