spring ioc容器创建与bean初始化源码解析4:初始化MessageSource ApplicationEventMulticaster ApplicationListener

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);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值