Back to Javatutorial

Spring启动流程(七):国际化与事件处理

docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(七):国际化与事件处理.md

1.0.05.1 KB
Original Source

ģǼ spring ̡

7. ʻ: 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 ľãľͲչˡ

8. ʼ¼㲥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 ¼.

9. չ㣺onRefresh ()

AbstractApplicationContext#onRefresh spring ṩһչ㣬ݣ

protected void onRefresh() throws BeansException {

}

ҪضIJʵ֡

ǰʹõ ApplicationContext AnnotationConfigApplicationContext onRefresh() Ͳˡ

10. ע¼registerListeners ()

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

̴£

  1. AbstractApplicationContext#applicationListeners еļ ApplicationEventMulticaster
  2. beanFactory ȡ beanNameӵ ApplicationEventMulticaster
  3. ¼ͽй㲥

spring ¼IJչ˽࣬ɲο spring ֮̽ spring ¼.

ĵķ͵ˡ


ԭӣhttps://my.oschina.net/funcy/blog/4892120 ߸ˮƽд֮ӭָԭףҵתϵ߻Ȩҵתע