当前位置: 代码迷 >> 综合 >> spring启动流程探索八、refresh()(7)
  详细解决方案

spring启动流程探索八、refresh()(7)

热度:21   发布时间:2023-11-26 12:02:26.0

spring探索第八节

  • initMessageSource()
  • initApplicationEventMulticaster()
  • onRefresh
  • registerListeners

initMessageSource()

这个方法其实是就是为了初始化MessageSource,
如果在此上下文中未定义,则使用父项。

protected void initMessageSource() {
    ConfigurableListableBeanFactory beanFactory = getBeanFactory();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.isTraceEnabled()) {
    logger.trace("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.isTraceEnabled()) {
    logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");}}}

initApplicationEventMulticaster()

这里是为容器中注入一个事件多播器,用来通知容器中的监听器,这里是运用到了观察者模式,
这里的多播器承担着subjects角色,负责接收事件信息,并通知监听器

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);if (logger.isTraceEnabled()) {
    logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");}}else {
    this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);if (logger.isTraceEnabled()) {
    logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");}}}

onRefresh

这是一个扩展接口,spring内部没有实现,是用来在bean初始化之前在特定上下文子类中初始化其他特殊bean。

registerListeners

这里是在容器中注册一些监听器,然后把这些监听器放进多播器,以便后面事件触发后通知,这些监听器在观察者模式中承担obervers角色

	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!//获取容器中的ApplicationListener定义信息String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);for (String listenerBeanName : listenerBeanNames) {
    
//将拿到的定义信息初始化bean放进多播器中 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);}// Publish early application events now that we finally have a multicaster...Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;this.earlyApplicationEvents = null;// 注册一些早期事件if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
    for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
    getApplicationEventMulticaster().multicastEvent(earlyEvent);}}}

看到这里,基本上容器中的一些初始化工作已经完成的差不多了,接下来就是初始化bean了。我们这里都是只关注流程,暂时先不总结。

  相关解决方案