写在前面
关于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);
}