docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(七):国际化与事件处理.md
ģǼ spring ̡
initMessageSource()ʼ MessageSource ģ£
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext {
...
/**
* ʼ MessageSource
*/
protected void initMessageSource() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// beanFactoryдMessageSource ParentMessageSource
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
this.messageSource = beanFactory.getBean(
MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
if (hms.getParentMessageSource() == null) {
// ParentMessageSource
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
}
// beanFactoryвMessageSource --ע
else {
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this.messageSource = dms;
// ParentMessageSource
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
}
}
/**
* ظ messageSource
*/
@Nullable
protected MessageSource getInternalParentMessageSource() {
return (getParent() instanceof AbstractApplicationContext ?
((AbstractApplicationContext) getParent()).messageSource : getParent());
}
...
}
ԿҪDz MessageSourceҪΪѾ MessageSource ˣһЩԣʹ MessageSourceЩ ԣעᵽ beanFactory С
MessageSource ľãľͲչˡ
initApplicationEventMulticaster()AbstractApplicationContext#initApplicationEventMulticaster £
protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// ûԶ¼㲥ʹû
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this.applicationEventMulticaster =
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME,
ApplicationEventMulticaster.class);
}
else {
// ûûù㲥ʹĬϵ¼㲥
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME,
this.applicationEventMulticaster);
}
}
ҲܼѴ¼㲥ʹѴڵģʹһ ApplicationEventMulticasterҪ㲥¼ģ¼ݣԲο spring ֮̽ spring ¼.
AbstractApplicationContext#onRefresh spring ṩһչ㣬ݣ
protected void onRefresh() throws BeansException {
}
ҪضIJʵ֡
ǰʹõ ApplicationContext AnnotationConfigApplicationContext onRefresh() Ͳˡ
AbstractApplicationContext#registerListeners ش£
AbstractApplicationContext
/** ż */
private final Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<>();
/** صǰеļ */
public Collection<ApplicationListener<?>> getApplicationListeners() {
return this.applicationListeners;
}
/**
* Ӽ
*/
public void addApplicationListener(ApplicationListener<?> listener) {
Assert.notNull(listener, "ApplicationListener must not be null");
if (this.applicationEventMulticaster != null) {
this.applicationEventMulticaster.addApplicationListener(listener);
}
this.applicationListeners.add(listener);
}
/**
* ע
*/
protected void registerListeners() {
// ֶsetһЩ
// getApplicationListeners() ȡļͨ addApplicationListener(...) ӵ
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
// ȡȡƣõ㲥
// ʱȡļǴ beanFactory лȡģspringͨɨõ
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// Ӧ¼㲥
Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
if (earlyEventsToProcess != null) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
// 㲥¼
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
̴£
AbstractApplicationContext#applicationListeners еļ ApplicationEventMulticasterbeanFactory ȡ beanNameӵ ApplicationEventMulticasterspring ¼IJչ˽࣬ɲο spring ֮̽ spring ¼.
ĵķ͵ˡ
ԭӣhttps://my.oschina.net/funcy/blog/4892120 ߸ˮƽд֮ӭָԭףҵתϵȨҵתע