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 duplicates
	Set<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 = 10
 0 = "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 做什么用?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java硕哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值