目录
BeanFactory和ApplicationContext的关系
简介
DefaultListableBeanFactory已经是一个成熟的容器了,是Spring的默认BeanFactory;
实现了BeanDefinitionRegistry接口,可通过读取配置文件等方式,预先注册所有bean定义;
bean定义:描述bean的作用范围、ROLE等级、是否懒加载、depends-on等信息;这个概念在AbstractBeanFactory才出现,在FactoryBeanRegistrySupport之前都没有

/**
* 注册bean定义
*/
@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);
}
}
BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
if (existingDefinition != null) {
//已存在同名的bean定义
if (!isAllowBeanDefinitionOverriding()) {
//不允许覆盖则抛异常
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
"': There is already [" + existingDefinition + "] bound.");
}
else if (existingDefinition.getRole() < beanDefinition.getRole()) {
// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
// 等级更高的bean定义将被覆盖
if (logger.isWarnEnabled()) {
logger.warn("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.isInfoEnabled()) {
logger.info("Overriding bean definition for bean '" + beanName +
"' with a different definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Overriding bean definition for bean '" + beanName +
"' with an equivalent definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
//注册
this.beanDefinitionMap.put(beanName, beanDefinition);
}
else {
if (hasBeanCreationStarted()) {
//容器已经进入创建bean的阶段,要做同步操作
// Cannot modify startup-time collect

本文介绍了Spring中的DefaultListableBeanFactory,它作为成熟的BeanFactory,实现了BeanDefinitionRegistry接口,支持预注册bean定义。同时,文章讨论了项目启动后容器如何初始化单例对象,以及BeanFactory和ApplicationContext的关系,后者提供了事件机制等高级特性。
最低0.47元/天 解锁文章
495

被折叠的 条评论
为什么被折叠?



