专栏首页ios 技术积累Spring Boot 自动配置

Spring Boot 自动配置

Spring Boot 启动方法如下

@SpringBootApplication
public class ActuatorApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActuatorApplication.class, args);
    }

}
@SpringBootApplication 其实包含3个注解

○@SpringBootConfiguration:标记当前类为配置类 ○@EnableAutoConfiguration:开启自动配置 ○@ComponentScan:扫描主类所在的同级包以及下级包里的Bean

关键是@EnableAutoConfiguration 我们来看看@EnableAutoConfiguration的源代码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}

关键是@Import(AutoConfigurationImportSelector.class)导入的配置功能, AutoConfigurationImportSelector中的方法getCandidateConfigurations,得到待配置的class的类名集合

/**
 * Return the auto-configuration class names that should be considered. By default
 * this method will load candidates using {@link SpringFactoriesLoader} with
 * {@link #getSpringFactoriesLoaderFactoryClass()}.
 * @param metadata the source metadata
 * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation
 * attributes}
 * @return a list of candidate configurations
 */
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
            AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
        Assert.notEmpty(configurations,
                "No auto configuration classes found in META-INF/spring.factories. If you "
                        + "are using a custom packaging, make sure that file is correct.");
        return configurations;
}

下一步通过SpringFactoriesLoader.loadFactoryNames() 扫描所有 jar 包类路径下的META-INF/spring.factories,将扫描到的文件内容包装成properties对象,从properties中获取到EnableAutoConfiguration.class类名对应的值,然后把他们添加到容器中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java :: 用法

    JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下。

    赵哥窟
  • iOS NSMutableArray和NSArray实例执行mutableCopy和copy方法的区别?

    赵哥窟
  • Java == 与 equals

    ==的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。

    赵哥窟
  • 原 SpringBoot 2.0 系列00

    石奈子
  • 使用Apache Flink进行批处理入门教程

    原文地址:https://dzone.com/articles/getting-started-with-batch-processing-using-apac...

    大数据弄潮儿
  • 99%的java程序员都遇到过的笔试题

    这里咱们忽略空格,所以答案就是B,主要的是本道题考察的是Java语言中传参方式和不可变类的知识。

    用户4143945
  • Android安全攻防战,反编译与混淆技术完全解析(上)

    之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值得骄傲的事情。不过单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能,可能平常不太...

    用户1158055
  • [快学Python3]类基础

    概述 Python从设计之初就是面向对象的编程语言,所以在Python中创建一个类和对象是轻而易举的。 本文就Python的面向对象编程进行分享。 几个基本的概...

    苦叶子
  • 腾讯云PHP SDK之Windows PHP Composer

    http://www.downxia.com/downinfo/162121.html

    我爱你的一诺
  • 聊聊spring cloud gateway的ForwardedHeadersFilter

    本文主要研究一下spring cloud gateway的ForwardedHeadersFilter

    codecraft

扫码关注云+社区

领取腾讯云代金券