Spring AutoConfigurationMetadataLoader是如何工作的 ?
2017-11-15 18:17
633 查看
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); } } }
相关文章推荐
- Spring 工具类 ConfigurationClassParser 是如何工作的 ?
- Spring Boot . 3 -- Spring Boot Auto_configuration 是如何实现的?
- Spring ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry() 是如何工作的 ?
- Spring boot如何写一个自定义的auto-configuration(上)
- Spring boot如何写一个自定义的auto-configuration(下)
- AUTO_INCREMENT列在InnoDB里如何工作
- MyBatis 与 Spring 是如何结合在一起工作的——mybatis-spring(version:1.2.2)
- web.xml中spring如何通过ContextLoaderListener初始化的
- Zend_Loader_Autoloader是如何工作的
- spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的
- 了解 Spring Boot AutoConfiguration
- Action中如何通过@Autowired自动注入spring bean ?
- 自增列(auto-increment)是如何在 InnoDB 中工作的
- META-INF/spring.factories中找不到自动配置类,No auto configuration classes found in META-INF/spring.factories.
- spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的
- [Spring Boot实战系列] - No.4 Spring boot 中如何在Utils类中使用@Autowired注入bean
- SQLPLUS:AUTOTRACE是如何工作的
- Spring boot web 应用 Bean介绍 : AutoConfigurationPackages
- 流程图解Spring Framework(五) Spring BeanFactoryPostProcessor如何工作的?
- Spring Boot自动配置(Auto-Configuration),@EnableAutoConfiguration,Spring Beans和依赖注入