spring之AutoConfigurationMetadataLoader分析

写在前面

关于springboot系列详细分析,可以参考这里
这篇文章中,我们分析了springboot自动配置的原理,其中有AutoConfigurationMetadataLoader类,负责提前从配置文件中加载每个自动配置类所要满足的条件注解信息,但是并没有详细讲解这个加载过程,本文作为补充。

1:分析

我们再来看下加载的入口方法,源码如下:

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.AutoConfigurationGroup#getAutoConfigurationMetadata
private AutoConfigurationMetadata getAutoConfigurationMetadata() {
	if (this.autoConfigurationMetadata == null) {
		// <202106301037>
		this.autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
	}
	return this.autoConfigurationMetadata;
}

<202106301037>处源码如下:

org.springframework.boot.autoconfigure.AutoConfigurationMetadataLoader#loadMetadata(java.lang.ClassLoader)
public static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) {
	// protected static final String PATH = "META-INF/" + "spring-autoconfigure-metadata.properties";
	// <202106301038>
	return loadMetadata(classLoader, PATH);
}

<202106301038>处源码如下:

org.springframework.boot.autoconfigure.AutoConfigurationMetadataLoader#loadMetadata(java.lang.ClassLoader, java.lang.String)
static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) {
	try {
		// 通过类加载器获取url集合
		Enumeration<URL> urls = (classLoader != null) ? classLoader.getResources(path)
				: ClassLoader.getSystemResources(path);
		// 加载到Properties中,部分结果实例如下:
		/*
		org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration.ConditionalOnClass -> javax.sql.DataSource,org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType
		org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration.ConditionalOnClass -> com.hazelcast.core.HazelcastInstance,org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
		org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration.ConditionalOnSingleCandidate -> org.springframework.mail.javamail.JavaMailSenderImpl
		*/
		Properties properties = new Properties();
		while (urls.hasMoreElements()) {
			properties.putAll(PropertiesLoaderUtils.loadProperties(new UrlResource(urls.nextElement())));
		}
		// <202106301051>
		return loadMetadata(properties);
	}
	catch (IOException ex) {
		throw new IllegalArgumentException("Unable to load @ConditionalOnClass location [" + path + "]", ex);
	}
}

<202106301051>处源码如下:

org.springframework.boot.autoconfigure.AutoConfigurationMetadataLoader#loadMetadata(java.util.Properties)
static AutoConfigurationMetadata loadMetadata(Properties properties) {
	// 封装成PropertiesAutoConfigurationMetada对象并返回
	return new PropertiesAutoConfigurationMetadata(properties);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值