1. beanFactory容器的创建及初始化
参考:spring ioc容器创建与bean初始化源码解析1:beanFactory容器的创建及初始化
2. 在beanFactory容器初始化之后定制和修改BeanFactory内容
参考:spring ioc容器创建与bean初始化源码解析2:在beanFactory容器初始化之后定制和修改BeanFactory内容
3. 注册BeanPostProcessor(作用在bean创建的过程中进行拦截,从而执行指定逻辑)
参考:spring ioc容器创建与bean初始化源码解析3:注册BeanPostProcessor(作用在bean创建的过程中进行拦截,从而执行指定逻辑)
4. 初始化MessageSource ApplicationEventMulticaster ApplicationListener
参考:spring ioc容器创建与bean初始化源码解析4:初始化MessageSource ApplicationEventMulticaster ApplicationListener
5. 初始化所有剩余未初始化的单实例bean及最终完成容器创建
参考:spring ioc容器创建与bean初始化源码解析5:初始化所有剩余未初始化的单实例bean及最终完成容器创建
6. spring ioc容器创建与bean初始化源码解析总结
参考:spring ioc容器创建与bean初始化源码解析总结
以下是第四篇
7. initMessageSource();
初始化MessageSource组件(做国际化功能,消息绑定,消息解析);
// Initialize message source for this context.
initMessageSource();
7.1 获取BeanFactory
7.2 看容器中是否有id为messageSource的,类型是MessageSource的组件
即我们可以自己配置一个
public static final String MESSAGE_SOURCE_BEAN_NAME = "messageSource";
如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;
MessageSource接口是用于解析消息的策略接口,支持message的参数化和国际化
MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;
7.3 把创建好的MessageSource注册在容器中
以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
8. initApplicationEventMulticaster();
初始化事件多播派发器;
前面有介绍,参考:spring中ApplicationListener及ApplicationEventMulticaster的作用
8.1 获取BeanFactory
8.2 从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;
8.3 如果上一步没有配置;创建一个SimpleApplicationEventMulticaster
SimpleApplicationEventMulticaster类图
在AbstractApplicationEventMulticaster中维护了一个Set
public final Set<ApplicationListener<?>> applicationListeners;
在第10步 registerListener的时候,将系统中的ApplicationListener添加到这个set中
8.4 将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
9. onRefresh();
在特定的context子类中初始化其他special bean
留给子容器(子类)
9.1 子类重写这个方法,在容器刷新的时候可以自定义逻辑;
protected void onRefresh() throws BeansException {
// For subclasses: do nothing by default.
}
可以重写的模板方法,以添加特定于context的refresh刷新工作。
在实例化单例之前 调用特殊bean的初始化。
10. registerListeners();
给容器中将所有项目里面的ApplicationListener注册进来;
之前也介绍过:ApplicationListener
10.1 从容器中拿到所有的ApplicationListener
10.2 将每个监听器添加到事件派发器中;
在AbstractApplicationEventMulticaster中维护了一个Set
public final Set<ApplicationListener<?>> applicationListeners;
将系统注册的ApplicationListener都加入到第8步中的ApplicationEventMulticaster中
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
10.3 派发之前步骤产生的事件;
// Publish early application events now that we finally have a multicaster...
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}