如图:
红圈的五个类都值得分析一下。
官方解释: BeanDefinition是Bean的定义,描述了一个Bean实例。它包含了描述一个Bean所需的最少接口方法。一个BeanDefinition会有属性值、构造器参数和其它更多信息(取决于具体实现)。
我的理解: 通过解析xml的<bean>节点,或者解析注解类,会将Bean的定义设置到BeanDefinition。但仅仅是BeanDefinition各种成员变量的设置,还没有实例化对象。 换句话说,对于xml解析法,只是把xml的<bean>文本转换为BeanDefinition对象而已;对于注解法,只是把注解的类转换为BeanDefinition对象而已。
常用的一般是GenericBeanDefinition和AnnotatedGenericBeanDefinition。
属性解析 Spring源码解析——AbstractBeanDefinition属性
public class BeanDefinitionHolder implements BeanMetadataElement {
private final BeanDefinition beanDefinition;
private final String beanName;
@Nullable
private final String[] aliases;
// ...
}
在解析出BeanDefinition后,会再度封装出BeanDefinitionHolder。 BeanDefinitionHolder其实就是BeanDefinition加上beanName和一些别名。BeanDefinition本身包含了Bean的定义,但没包含beanName和别名。
创建BeanDefinition主要包括两个步骤:
解析时会调用到BeanDefinitionReaderUtils.registerBeanDefinition:
public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
throws BeanDefinitionStoreException {
// Register bean definition under primary name.
String beanName = definitionHolder.getBeanName();
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
// Register aliases for bean name, if any.
String[] aliases = definitionHolder.getAliases();
if (aliases != null) {
for (String alias : aliases) {
registry.registerAlias(beanName, alias);
}
}
}
在此注册BeanDefinition和别名。