1、流程概述

1、从classpath下的 META-INF/spring.factories(点击查看)文件中找出 ApplicationListener 类型的所有类的全类名。

2、通过反射创建这些类的对象

3、最后把这些对象放入SpringApplication对象的List实例变量中。

示意图

2、状态图

此时 SpringApplication 对象的内存状态如下图

SpringApplication 内存状态

3、源码解读

2.1、源码结构


源码结构:
initialize
|- getSpringFactoriesInstances
        |- SpringFactoriesLoader.loadFactoryNames
        |- createSpringFactoriesInstances
        |- AnnotationAwareOrderComparator.sort
|- setListeners


2.2、参考源码

private void initialize(Object[] sources) {if (sources != null && sources.length > 0) {this.sources.addAll(Arrays.asList(sources));}this.webEnvironment = deduceWebEnvironment();setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = deduceMainApplicationClass();
}

本文关注的是这行代码:setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class))

private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type) {return getSpringFactoriesInstances(type, new Class<?>[] {});
}private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type,Class<?>[] parameterTypes, Object... args) {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();// Use names and ensure unique to protect against duplicatesSet<String> names = new LinkedHashSet<String>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));List<T> instances = createSpringFactoriesInstances(type, parameterTypes,classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances;
}
private List<ApplicationListener<?>> listeners;
public void setListeners(Collection<? extends ApplicationListener<?>> listeners) {this.listeners = new ArrayList<ApplicationListener<?>>();this.listeners.addAll(listeners);
}

getSpringFactoriesInstances方法用来解析并创建 ApplicationListener 实例
其中 getSpringFactoriesInstances(ApplicationListener.class) 如下:

names = {LinkedHashSet@1636}  size = 100 = "o.s.boot.ClearCachesApplicationListener"1 = "o.s.boot.builder.ParentContextCloserApplicationListener"2 = "o.s.boot.context.FileEncodingApplicationListener"3 = "o.s.boot.context.config.AnsiOutputApplicationListener"4 = "o.s.boot.context.config.ConfigFileApplicationListener"5 = "o.s.boot.context.config.DelegatingApplicationListener"6 = "o.s.boot.liquibase.LiquibaseServiceLocatorApplicationListener"7 = "o.s.boot.logging.ClasspathLoggingApplicationListener"8 = "o.s.boot.logging.LoggingApplicationListener"9 = "o.s.boot.autoconfigure.BackgroundPreinitializer"

setListeners方法这些实例放入SpringApplication 实例的 List<ApplicationListener<?>> listeners 变量中。

END

3、Q&A

Q1 什么是 ApplicationListener?什么场景下使用?

Q2 设置 Listener 做什么用?

1.3、解析并创建ApplicationListener(ok)相关推荐

  1. android 如何实现无限列表,在Android中解析和创建无限/无限级别的List /子列表中的XML...

    在我的Android Application的服务器端应用程序也由我开发.在这个应用程序Android应用程序从服务器请求一些XML并解析它. XML包含描述应用程序中应该有多少标签的信息,并且每个标 ...

  2. SwiftUI之深入解析如何创建列表展示视图和列表如何导航跳转新页面

    一.前言 地标详情页视图已经创建完成,我们需要提供一种方式让用户可以查看完整的地标列表,并且可以查看每一个地标的详情.地标详情页视图的创建,请参考我的博客:SwiftUI之深入解析如何创建和组合视图. ...

  3. java解析dxf文件_浅析JVM方法解析、创建和链接

    一:前言 上周末写了一篇文章<你知道Java类是如何被加载的吗?>,分析了HotSpot是如何加载Java类的,干脆趁热打铁,本周末再来分析下Hotspot又是如何解析.创建和链接类方法的 ...

  4. PHP JSON的解析和创建

    文章目录 PHP JSON的解析和创建 json_encode() json_decode() PHP JSON的解析和创建 JSON(全称"JavaScript Object Notati ...

  5. 计算机一级演示文稿位置在哪里,2017年计算机一级MSOffice考点解析:创建演示文稿...

    5.2.1创建演示文稿 创建演示文稿主要有如下几种方式:创建空A演示文稿.根据主题.根据模板和根据现有演 示文稿创建等. 使用空白演示文稿方式,可以创建一个没有任何设计方案和示例文本的空白演示文稿,根 ...

  6. 一图看懂 toml 模块:用于解析和创建TOML(Tom‘s Obvious, Minimal Language)的Python库, 资料整理+笔记(大全)

    本文由 大侠(AhcaoZhu)原创,转载请声明. 链接: https://blog.csdn.net/Ahcao2008 @[TOC](一图看懂 toml 模块:用于解析和创建TOML(Tom's ...

  7. RxSwift之深入解析如何创建Observable序列

    一.emty 创建一个空的序列:本来序列事件是 Int 类型的,调用 emty 函数没有序列,只能 complete: let emtyOb = Observable<Int>.empty ...

  8. dubbo源码解析-zookeeper创建节点

    前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...

  9. XML解析和创建的JAXB方式

    1.说明 JAXB是Java Architecture for XML Binding, 即用于XML绑定的Java体系结构, JAXB作为JDK的一部分, 能便捷地将Java对象与XML进行相互转换 ...

最新文章

  1. 从面试角度一文学完 Kafka
  2. Hadoop生态Zookeeper安装
  3. [高精度乘法]BZOJ 1754 [Usaco2005 qua]Bull Math
  4. Selenium 显式等待条件及其含义
  5. 10条建议让你创建更好的jQuery插件(转载)
  6. java.lang.NoSuchMethodException: java.util.List.<init>() 问题解决
  7. active set method(激活集方法)
  8. 计算机内录音频文件格式,如何将电脑里发出的声音内录下来?
  9. html插入flash时钟,PPT怎么插入Flash时钟显示实时时间?
  10. 蒙特卡罗类型概率算法
  11. 联想硬盘保护安装linux,【原创参赛】联想硬盘保护系统 (详细说明)
  12. MySQL自学笔记(三)
  13. XTDRONE:ego_planner三维运动规划
  14. AndroidX全解析
  15. Java LeetCode每日一题-从易到难带你领略算法的魅力(一):上升下降字符串
  16. ISO/IEC JTC 1/SC 42人工智能分技术委员会第一次全会在京召开
  17. java多线程(超级详细)
  18. cannot unbox null value
  19. 发现panda(熊猫)对W32.Looked.I处理得不错
  20. Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not wor

热门文章

  1. html所属省份选择框_html中如何实现省市
  2. modelmap前端怎么取值_【百度】前端开发岗面试题
  3. oracle java 面试题及答案_Oracle面试题及答案
  4. php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解
  5. 微信公众号Web页面CSS文件里面的样式不加载
  6. 开源工具kettle中Job流程的理解
  7. Oracle日期和时间总结
  8. websocket连接出现 HTTP Authentication failed; no valid credentials available
  9. java 队列的使用
  10. Git如何创建本地分支并推送到远程仓库