方法主要作用
- bean配置读取
- spring框架启动流程
refresh方法
refresh方法是SprintBoot启动的一个重要步骤,其中包含了很多独立的方法
prepareRefresh
在这个方法中,会进行如下设置:
- 容器状态设置,比如启动时间
- 初始化属性设置,比如业务监听器
- 检查必备属性是否存在
必备属性的设置:
系统初始化器中设置
@Order(1)
public class FirstInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
environment.setRequiredProperties("mooc");
// Map<String, Object> map = new HashMap<>();
// map.put("key1", "value1");
// MapPropertySource mapPropertySource = new MapPropertySource("firstInitializer", map);
// environment.getPropertySources().addLast(mapPropertySource);
// System.out.println("run firstInitializer");
}
}
obtainFreshBeanFactory方法
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
- 设置beanFactory序列化ID
- 获取beanFactory
prepareBeanFactory方法
主要对beanFactory做一些基础配置
- 设置beanFactory一些属性
- 添加后置处理器
- 设置忽略的自动装配接口
- 注册一些组建
postProcessBeanFactory方法
子类重写以在BeanFactory完成创建后做进一步设置。比如设置web环境的作用域及环境信息
invokeBeanFactoryPostProcessors方法
此方法主要做两件事情
- 调用BeanDefinitionRegistryPostProcessor实现向容器添加bean的定义
@Component
public class MyBeanRegister implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setBeanClass(Monkey.class);
registry.registerBeanDefinition("monkey", rootBeanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
- 调用BeanFactoryPostProcessor实现向容器内bean的定义添加属性
@Component
public class MyBeanFactoryPostprocessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition teacher = beanFactory.getBeanDefinition("teacher");
MutablePropertyValues propertyValues = teacher.getPropertyValues();
propertyValues.addPropertyValue("name", "wangwu");
}
}
registerBeanPostProcessors方法
- 找到BeanPostProcessor的实现
- 排序后注册进容器内
initMessageSource方法
初始化国际化相关属性
initApplicationEventMulticaster方法
初始化事件广播器
onRefresh方法
留给子类实现的,如果是web容器,就会去初始化相关容器,比如tomacat,jetty等
registerListeners方法
- 添加容器内事件监听器至事件广播器中
- 派发早期事件(没有创建完监听器的时候就有的事件)
finishBeanFactoryInitialization 方法
- 初始化所有剩下的单实例bean
finishRefresh 方法
- 初始化生命周期处理器
- 调用生命周期处理器onRefresh方法
- 发布ContextRefreshedEvent事件
- JMX相关处理