您的位置:首页 > 移动开发

Spring-Spring容器启动各项操作窥探(AbstractApplicationContext#refesh()执行逻辑分析)

2014-04-11 15:18 736 查看
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();

// Tell the subclass to refresh the internal bean factory.
/**
*初始化BeanFactory.根据配置文件实例化BeanFactory,getBeanFactory方法由具体子类实现。在这一步里,Spring
*将配置文件的信息装入到容器的Bean定义注册表(BeanDefinitionRegistry)中,但此时Bean还未初始化。
*/
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);

try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);

/**
*调用工厂后处理器:根据反射机制从BeanDefinitionRegistry中找出所有BeanFactoryPostProcessor
*类型的Bean,并调用其postProcessBeanFactory()接口方法。
*/
invokeBeanFactoryPostProcessors(beanFactory);

/**
*注册Bean后处理器:根据反射机制从BeanDefinitionRegistry中找出所有BeanPostProcessor
*类型的Bean,并将它们注册到容器Bean后处理器的注册表中
**/
registerBeanPostProcessors(beanFactory);

// 初始化消息源:初始化容器的国际化信息资源
initMessageSource();

// 初始化应用上下文事件广播器.
initApplicationEventMulticaster();

/**
*初始化其它特殊的Bean:由具体子类实现;这是一个钩子方法,子类可以借助这个方法执行一些特殊的
*操作:如AbstractRefreshableWebApplicationContext就使用该方法执行初始化ThemeSource的操作
**/
onRefresh();

// 注册事件监听器
registerListeners();

// 初始化所有单实例的Bean(lazy-init的除外),初始化Bean后将它们放入Spring容器的缓存中;
finishBeanFactoryInitialization(beanFactory);

// 完成刷新并发布容器刷新事件:创建上下文刷新事件,事件广播器负责将这些事件广播到各个注册的事件监听器中。
finishRefresh();
}

catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();

// Reset 'active' flag.
cancelRefresh(ex);

// Propagate exception to caller.
throw ex;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring
相关文章推荐