1.3、解析并创建ApplicationListener(ok)
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)相关推荐
- android 如何实现无限列表,在Android中解析和创建无限/无限级别的List /子列表中的XML...
在我的Android Application的服务器端应用程序也由我开发.在这个应用程序Android应用程序从服务器请求一些XML并解析它. XML包含描述应用程序中应该有多少标签的信息,并且每个标 ...
- SwiftUI之深入解析如何创建列表展示视图和列表如何导航跳转新页面
一.前言 地标详情页视图已经创建完成,我们需要提供一种方式让用户可以查看完整的地标列表,并且可以查看每一个地标的详情.地标详情页视图的创建,请参考我的博客:SwiftUI之深入解析如何创建和组合视图. ...
- java解析dxf文件_浅析JVM方法解析、创建和链接
一:前言 上周末写了一篇文章<你知道Java类是如何被加载的吗?>,分析了HotSpot是如何加载Java类的,干脆趁热打铁,本周末再来分析下Hotspot又是如何解析.创建和链接类方法的 ...
- PHP JSON的解析和创建
文章目录 PHP JSON的解析和创建 json_encode() json_decode() PHP JSON的解析和创建 JSON(全称"JavaScript Object Notati ...
- 计算机一级演示文稿位置在哪里,2017年计算机一级MSOffice考点解析:创建演示文稿...
5.2.1创建演示文稿 创建演示文稿主要有如下几种方式:创建空A演示文稿.根据主题.根据模板和根据现有演 示文稿创建等. 使用空白演示文稿方式,可以创建一个没有任何设计方案和示例文本的空白演示文稿,根 ...
- 一图看懂 toml 模块:用于解析和创建TOML(Tom‘s Obvious, Minimal Language)的Python库, 资料整理+笔记(大全)
本文由 大侠(AhcaoZhu)原创,转载请声明. 链接: https://blog.csdn.net/Ahcao2008 @[TOC](一图看懂 toml 模块:用于解析和创建TOML(Tom's ...
- RxSwift之深入解析如何创建Observable序列
一.emty 创建一个空的序列:本来序列事件是 Int 类型的,调用 emty 函数没有序列,只能 complete: let emtyOb = Observable<Int>.empty ...
- dubbo源码解析-zookeeper创建节点
前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...
- XML解析和创建的JAXB方式
1.说明 JAXB是Java Architecture for XML Binding, 即用于XML绑定的Java体系结构, JAXB作为JDK的一部分, 能便捷地将Java对象与XML进行相互转换 ...
最新文章
- 从面试角度一文学完 Kafka
- Hadoop生态Zookeeper安装
- [高精度乘法]BZOJ 1754 [Usaco2005 qua]Bull Math
- Selenium 显式等待条件及其含义
- 10条建议让你创建更好的jQuery插件(转载)
- java.lang.NoSuchMethodException: java.util.List.<init>() 问题解决
- active set method(激活集方法)
- 计算机内录音频文件格式,如何将电脑里发出的声音内录下来?
- html插入flash时钟,PPT怎么插入Flash时钟显示实时时间?
- 蒙特卡罗类型概率算法
- 联想硬盘保护安装linux,【原创参赛】联想硬盘保护系统 (详细说明)
- MySQL自学笔记(三)
- XTDRONE:ego_planner三维运动规划
- AndroidX全解析
- Java LeetCode每日一题-从易到难带你领略算法的魅力(一):上升下降字符串
- ISO/IEC JTC 1/SC 42人工智能分技术委员会第一次全会在京召开
- java多线程(超级详细)
- cannot unbox null value
- 发现panda(熊猫)对W32.Looked.I处理得不错
- Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not wor
热门文章
- html所属省份选择框_html中如何实现省市
- modelmap前端怎么取值_【百度】前端开发岗面试题
- oracle java 面试题及答案_Oracle面试题及答案
- php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解
- 微信公众号Web页面CSS文件里面的样式不加载
- 开源工具kettle中Job流程的理解
- Oracle日期和时间总结
- websocket连接出现 HTTP Authentication failed; no valid credentials available
- java 队列的使用
- Git如何创建本地分支并推送到远程仓库