refresh()方法

public void refresh() throws BeansException, IllegalStateException {
//上锁
synchronized (this.startupShutdownMonitor) {
//1、调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识
prepareRefresh();

//2、告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从子类的refreshBeanFactory()方法启动
//(实例化一个DefaultListableBeanFactory,加载资源文件中(xml配置)的配置生成BeanDefinition)
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

//3、为BeanFactory配置容器特性,例如类加载器、事件处理器等
prepareBeanFactory(beanFactory);

try {

//4、为容器的某些子类指定特殊的BeanPost事件处理器
postProcessBeanFactory(beanFactory);


//5、调用所有注册的BeanFactoryPostProcessor的Bean (会扫描注册bean到ioc容器)
invokeBeanFactoryPostProcessors(beanFactory);


//6、为BeanFactory注册BeanPostProcessors事件处理器. BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件
registerBeanPostProcessors(beanFactory);

//7、初始化信息源,和国际化相关.
//initMessageSource()方法用来设置国际化资源相关的调用,将实现了MessageSource接口的bean存放
// 在ApplicationContext的成员变量中,先看是否有此配置,如果有就实例化,否
// 则就创建一个DelegatingMessageSource实例的bean
initMessageSource();

//8、初始化容器事件传播器.
//多播器单独的作用不大,他需要与第10步的监听器,构成观察者模式,监听整个过程的触发的事件;
initApplicationEventMulticaster();

//9、调用子类的某些特殊Bean初始化方法
onRefresh();

//10、为事件传播器注册事件监听器.
registerListeners();

//11、初始化所有剩余的单例Bean
finishBeanFactoryInitialization(beanFactory);

//12、初始化容器的生命周期事件处理器,并发布容器的生命周期事件
finishRefresh();
}

catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}

//13、销毁已创建的Bean
destroyBeans();

//14、取消refresh操作,重置容器的同步标识。
cancelRefresh(ex);

// 将exception抛给调用者。
throw ex;
}

finally {
//15、重设公共缓存
resetCommonCaches();
}
}
}

posted on 2022-07-30 21:55  冬天里暖阳  阅读(90)  评论(0编辑  收藏  举报

导航