- obtainFreshBeanFactory();
- prepareBeanFactory(beanFactory);
- postProcessBeanFactory(beanFactory);
- invokeBeanFactoryPostProcessors(beanFactory);
- registerBeanFactoryProcessors(beanFactory);
- finishBeanFactoryInitialization(beanFactory);
obtainFreshBeanFactory();
现在还是在这个方法里面,上篇已经看完了将标签转换成BeanDefinition的整个过程,接着要看下将BeanDefinition注册到BeanFactory的过程。
DefaultBeanDefinitionDecumentReader#processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
// 1、看完了这个,将标签转换成BeanDefinition
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
if (bdHolder != null) {
bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
try {
// 2、现在要看这个,注册生成好了的BeanDefinition
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
}
catch (BeanDefinitionStoreException ex) {
getReaderContext().error("Failed to register bean definition with name '" +
bdHolder.getBeanName() + "'", ele, ex);
}
// 3、发送注册事件,这个忽略
getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
}
}
回到processBeanDefinition方法,已经看完了第一步,现在看第二步:注册的过程。
- BeanDefinitionReaderUtils#registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
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());
// 处理别名
String[] aliases = definitionHolder.getAliases();
if (aliases != null) {
for (String alias : aliases) {
registry.registerAlias(beanName, alias);
}
}
}
这个方法先用beanName注册BeanDefinition,然后再处理别名,其实也就是用一个Map保存每一个别名和beanName,也就是Map<alias, beanName>,这样就可以通过别名获取到beanName,然后再找到对应的Bean,这个不是重点,重点是registerBeanDefinition。
- DefaultListableBeanFactory#registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
Assert.hasText(beanName, "Bean name must not be empty");
Assert.notNull(beanDefinition, "BeanDefinition must not be null");
// 校验的代码,过
if (beanDefinition instanceof AbstractBeanDefinition) {
try {
((AbstractBeanDefinition) beanDefinition).validate();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Validation of bean definition failed", ex);
}
}
// 这个beanDefinitionMap就是用来装beanDefinition的map
BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
// 如果beanDefinition已经存在的分支
if (existingDefinition != null) {
// 不允许覆盖的话,肯定就会抛异常了
if (!isAllowBeanDefinitionOverriding()) {
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
// 权限
else if (existingDefinition.getRole() < beanDefinition.getRole()) {
// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
if (logger.isInfoEnabled()) {
logger.info("Overriding user-defined bean definition for bean '" + beanName +
"' with a framework-generated bean definition: replacing [" +
existingDefinition + "] with [" + beanDefinition + "]");
}
}
else if (!beanDefinition.equals(existingDefinition)) {
if (logger.isDebugEnabled()) {
logger.debug("Overriding bean definition for bean '" + beanName +
"' with a different definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
else {
if (logger.isTraceEnabled()) {
logger.trace("Overriding bean definition for bean '" + beanName +
"' with an equivalent definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
// 最后会覆盖老的beanDefinition
this.beanDefinitionMap.put(beanName, beanDefinition);
}
else {
// 如果有其他线程也启动了初始化
if (hasBeanCreationStarted()) {
// Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized (this.beanDefinitionMap) {
this.beanDefinitionMap.put(beanName, beanDefinition);
List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
updatedDefinitions.addAll(this.beanDefinitionNames);
updatedDefinitions.add(beanName);
this.beanDefinitionNames = updatedDefinitions;
removeManualSingletonName(beanName);
}
}
// 正常应该是走这个分支
else {
// 保存beanDefinition
this.beanDefinitionMap.put(beanName, beanDefinition);
// 保存beanName
this.beanDefinitionNames.add(beanName);
// manual是手动的意思,手动注册的beanName
// 这里都是自动注册的,所以remove掉
removeManualSingletonName(beanName);
}
this.frozenBeanDefinitionNames = null;
}
if (existingDefinition != null || containsSingleton(beanName)) {
resetBeanDefinition(beanName);
}
}
这个方法代码没什么难的,看着长,看注释就行了,最主要的就是:
一个beanDefinitionMap保存了beanName和beanDefinition;
一个beanDefinitionNames的list保存了所有的beanName;
加上之前的一个aliasMap保存了别名和beanName;
一个manualSingletonNames的set保存了手动注册的beanName,用到的数据结构就这些了。
到这里,obtainFreshBeanFactory()方法看完了,这个方法做了三件事情:
- 创建了一个DefaultListableBeanFactory对象,也就是一个beanFactory;
- 根据配置文件,将要加载的bean转换成了BeanDefinition对象;
- 将BeanDefinition对象注册到beanFactory容器中,也就是保存在DefaultListableBeanFactory的beanDefinitionMap属性中。