Spring AutoConfigurationMetadataLoader是如何工作的 ?
来源:互联网 发布:美白产品推荐知乎 编辑:程序博客网 时间:2024/06/03 18:05
AutoConfigurationMetadataLoader是 Spring boot autoconfigure 加载AutoConfigurationMetadata的内部工具类
/** * 用于加载 AutoConfigurationMetadata 的内部工具类 */final class AutoConfigurationMetadataLoader { // 定义要加载的AutoConfigurationMetadata的文件路径 protected static final String PATH = "META-INF/" + "spring-autoconfigure-metadata.properties"; private AutoConfigurationMetadataLoader() { } public static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) { return loadMetadata(classLoader, PATH); } static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) { try { // 找到自动配置元数据属性文件,可能有多个 // 其实就是各个jar包中的文件META-INF\spring-autoconfigure-metadata.properties, // 其路径类似于spring-boot-autoconfigure-xxx.jar!\META-INF\spring-autoconfigure-metadata.properties Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(path) : ClassLoader.getSystemResources(path)); // 从所发现的配置文件中加载所有的配置信息到一个 properties 对象 Properties properties = new Properties(); while (urls.hasMoreElements()) { properties.putAll(PropertiesLoaderUtils .loadProperties(new UrlResource(urls.nextElement()))); } // 返回AutoConfigurationMetadata对象,其实现为内部类 PropertiesAutoConfigurationMetadata return loadMetadata(properties); } catch (IOException ex) { throw new IllegalArgumentException( "Unable to load @ConditionalOnClass location [" + path + "]", ex); } } static AutoConfigurationMetadata loadMetadata(Properties properties) { return new PropertiesAutoConfigurationMetadata(properties); } /** * 基于一个属性文件(properties file)的AutoConfigurationMetadata实现 */ private static class PropertiesAutoConfigurationMetadata implements AutoConfigurationMetadata { private final Properties properties; PropertiesAutoConfigurationMetadata(Properties properties) { this.properties = properties; } @Override public boolean wasProcessed(String className) { return this.properties.containsKey(className); } @Override public Integer getInteger(String className, String key) { return getInteger(className, key, null); } @Override public Integer getInteger(String className, String key, Integer defaultValue) { String value = get(className, key); return (value != null ? Integer.valueOf(value) : defaultValue); } @Override public Set<String> getSet(String className, String key) { return getSet(className, key, null); } @Override public Set<String> getSet(String className, String key, Set<String> defaultValue) { String value = get(className, key); return (value != null ? StringUtils.commaDelimitedListToSet(value) : defaultValue); } @Override public String get(String className, String key) { return get(className, key, null); } @Override public String get(String className, String key, String defaultValue) { String value = this.properties.getProperty(className + "." + key); return (value != null ? value : defaultValue); } }}
阅读全文
0 0
- Spring AutoConfigurationMetadataLoader是如何工作的 ?
- Spring ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry() 是如何工作的 ?
- Spring EnableAutoConfigurationImportSelector 是如何工作的 ?
- spring-boot-autoconfigure 是如何工作的?
- Spring MVC 到底是如何工作的?
- Spring Boot是如何工作的?
- Spring MVC 到底是如何工作的?
- Spring MVC 到底是如何工作的?
- Spring mvc的注解是如何工作的
- Spring 工具类 ConfigurationClassParser 是如何工作的 ?
- oracle是如何工作的
- Oracle是如何工作的
- Oracle是如何工作的
- Oracle是如何工作的
- Oracle是如何工作的
- SSL是如何工作的?
- 杀毒软件是如何工作的
- SSL是如何工作的?
- matlab中用unique函数去除矩阵重复的行,且不改变矩阵顺序
- 28.Nginx HTTP之读取处理请求行函数ngx_http_process_request_line
- 程序设计基础—入门知识点(一)
- MATLAB2012b启动,总是打开激活页面无法启动
- matplotlib调整子图间距,调整整体空白
- Spring AutoConfigurationMetadataLoader是如何工作的 ?
- Linux 安装字体库-宋体
- NYOJ F. 邮票分你一半
- Web 单点登录SSO
- 简单的单层神经网络的实现,附代码
- 三道典型C语言题(5)
- Excel中,公式正确显示,却有时候识别不了公式,计算不出结果
- [译]Android Package Name Vs Application ID
- 11.11作业