refresh方法介绍
bean配置读取和加载入口
在这个方法内完成sping框架启动流程
首先从SpringBoot的启动run方法,进入到AbstractApplicationContext类refresh方式涉及到下面多个子方法的调用
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. 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); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } finally { // Reset common introspection caches in Spring's core, since we // might not ever need metadata for singleton beans anymore... resetCommonCaches(); } } }
1、prepareRefresh();
容器状态设置
初始化属性设置
检查必备属性是否存在
2、obtainFreshBeanFactory
设置beanFactory序列化id
获取beanFactory
3、prepareBeanFactory(beanFactory);
设置beanFactory一些属性
添加后置处理器
设置忽略的自动装配接口
注册一些主件
4、postProcessBeanFactory(beanFactory);
子类重写以在BeanFactory完成创建后做进一步设置
5、invokeBeanFactoryPostProcessors(beanFactory);
调用BeanDefinitionRegistryPostProcessor实现向容器内添加bean的定义 (使用参考: 实现BeanDefinitionRegistryPostProcessor)
调用BeanFactoryPostProcessor实现向容器内添加bean的定义添加属性
BeanFactoryPostProcessor的使用
1)创建Teacher类
@Component public class Teacher { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
2)创建类MyBeanFactoryPostProcessor ,实现BeanFactoryPostProcessor接口。并且给teacher增加name属性值为Nick
@Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { BeanDefinition teacher = configurableListableBeanFactory.getBeanDefinition("teacher"); MutablePropertyValues propertyValues = teacher.getPropertyValues(); propertyValues.addPropertyValue("name","Nick"); } }
3)运行测试方法testTeacher
结果为
6、registerBeanPostProcessors(beanFactory);
找到BeanPostPocessor的实现
排序后注册进容器内
7、initMessageSource();
初始化国际化相关属性
8、 initApplicationEventMulticaster();
初始化事件广播器。注册到容器当中
9、onRefresh();
创建web容器。如果是web环境当中,会进入如下图的方法,构建一个web容器,如tomcat,jetty等。
10、registerListeners();
添加容器内事件监听器至事件广播器中
派发早期事件
11、finishBeanFactoryInitialization(beanFactory);
初始化剩下的单实例Bean
12、finishRefresh();
初始化生命周期处理器
调用生命周期处理器的onRefresh方法
发布ContextRefreshedEvent 事件
JMX相关处理
13、 resetCommonCaches();
清除缓存
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!