现在到了 ApplicationContext 的 refresh() 方法中初始化消息源与事件广播器, 这两个方法比较像, 并且逻辑较少, 放在一起看看.
initMessageSource
判断 beanFactory 中是否有名字为 messageSource 的 bean, 如果有, 从 beanFactory 中获取并且判断获取的是不是 HierarchicalMessageSource 类型的, 如果是设置其父级消息源
如果没有, 新建 DelegatingMessageSource 类作为 messageSource 的 Bean.
- protected void initMessageSource() {
- // 获取 BeanFactory
- ConfigurableListableBeanFactory beanFactory = getBeanFactory();
- // 判断 beanFactory 中是否有名字为 messageSource 的 bean
- // MESSAGE_SOURCE_BEAN_NAME = "messageSource";
- // 如果没有, 新建 DelegatingMessageSource 类作为 messageSource 的 Bean.
- // 如果有, 从 beanFactory 中获取
- if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
- this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
- // Make MessageSource aware of parent MessageSource.
- if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
- HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
- if (hms.getParentMessageSource() == null) {
- // Only set parent context as parent MessageSource if no parent MessageSource
- // registered already.
- hms.setParentMessageSource(getInternalParentMessageSource());
- }
- }
- if (logger.isDebugEnabled()) {
- logger.debug("Using MessageSource [" + this.messageSource + "]");
- }
- }
- else {
- // Use empty MessageSource to be able to accept getMessage calls.
- DelegatingMessageSource dms = new DelegatingMessageSource();
- dms.setParentMessageSource(getInternalParentMessageSource());
- this.messageSource = dms;
- beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
- if (logger.isDebugEnabled()) {
- logger.debug("Unable to locate MessageSource with name'" + MESSAGE_SOURCE_BEAN_NAME +
- "': using default [" + this.messageSource + "]");
- }
- }
- }
- initApplicationEventMulticaster
初始化 ApplicationEventMulticaster, 如果 beanFactory 中不存在的话使用 SimpleApplicationEventMulticaster, 如果存在使用从 beanFactory 中获取的.
- protected void initApplicationEventMulticaster() {
- ConfigurableListableBeanFactory beanFactory = getBeanFactory();
- //APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";
- if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
- this.applicationEventMulticaster =
- beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
- if (logger.isDebugEnabled()) {
- logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
- }
- }
- else {
- this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
- beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
- if (logger.isDebugEnabled()) {
- logger.debug("Unable to locate ApplicationEventMulticaster with name'" +
- APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
- "': using default [" + this.applicationEventMulticaster + "]");
- }
- }
- }
- onRefresh
再多说一个 onrefresh 方法, 这个在 Spring 框架中是没有实现的, 留待我们继承可用来在实例化 Singleton 之前, 实例化一些特殊的 bean.
registerListeners
这个方法再 refresh 中也比较简单, 都顺便记录下.
获取 ApplicationContext 初始化的 listeners, 然后添加到 EventMulticaster, 这个刚才初始化的, 如果为空为 SimpleApplicationEventMulticaster 的那个
从 BeanFactory 中获取 ApplicationListener 类型的 Bean, 并且添加为 ListenerBeans
有些事件可能要提前发出, 将需要提前发出的事件发出并置空.
- protected void registerListeners() {
- // Register statically specified listeners first.
- for (ApplicationListener<?> listener : getApplicationListeners()) {
- getApplicationEventMulticaster().addApplicationListener(listener);
- }
- // Do not initialize FactoryBeans here: We need to leave all regular beans
- // uninitialized to let post-processors apply to them!
- String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
- for (String listenerBeanName : listenerBeanNames) {
- getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
- }
- // Publish early application events now that we finally have a multicaster...
- Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
- this.earlyApplicationEvents = null;
- if (earlyEventsToProcess != null) {
- for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
- getApplicationEventMulticaster().multicastEvent(earlyEvent);
- }
- }
- }
- TODO
AbstractApplicationEventMulticaster 类的详细设计
最后
这几个方法比较简单, 一起看看
来源: http://www.jianshu.com/p/3e4bb1db9445