003--SpringBoot如何实现自动配置

SpringBoot在SpringApplication创建对象实例的时候,会默认读取 "META-INF/spring.factories" 中信息,然后将该文件中的配置信息载入到Spring中

  • 1.点击SpringApplication.run(HelloApplication.class, args);
  • 2.SpringApplication的初始化方法

setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class));

    @SuppressWarnings({ "unchecked", "rawtypes" })
    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();
    }
  • 3.在SpringFactoriesLoader加载方法中

SpringFactoriesLoader.loadFactoryNames(type, classLoader));

    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;
    }
  • 4.读取"META-INF/spring.factories"文件

classLoader.getResources("META-INF/spring.factories")

    public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
        String factoryClassName = factoryClass.getName();
        try {
            Enumeration urls = (classLoader != null)
                    ? classLoader.getResources("META-INF/spring.factories")
                    : ClassLoader.getSystemResources("META-INF/spring.factories");

            List result = new ArrayList();
            while (urls.hasMoreElements()) {
                URL url = (URL) urls.nextElement();
                Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
                String factoryClassNames = properties.getProperty(factoryClassName);
                result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
            }
            return result;
        } catch (IOException ex) {
            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName()
                    + "] factories from location [" + "META-INF/spring.factories" + "]", ex);
        }
    }
  • 5.查看"META-INF/spring.factories"文件
    - 1.在SpringBoot中有一个Jar包:spring-boot
    - 2.在SpringBoot中有一个Jar包:spring-boot-autoconfigure
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,104评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,345评论 6 342
  • 文章较长,建议先收藏,在较空的时候来看。 Spring Boot 框架的初衷:快速地启动Spring应用Sprin...
    Drew_Zhong阅读 2,908评论 3 15
  • 短暂的繁忙过后 身体疲惫 围绕着人们的 是这一江春水 剪不断的愁 你听 是谁低吟 凄凄惨惨戚戚
    樊小篱阅读 179评论 4 17
  • 今天我想说的是发生在我身边一个真实的事件。 我的同事和淑女两个字根本搭不上边,性格反而有点大大咧咧,用别人的话来形...
    弃妃阅读 1,030评论 0 0

友情链接更多精彩内容