Spring Boot核心-SpringBootApplication自动配置原理

接着说@SpringBootApplication

知道了这是一个组合注解,用在启动类上,然后main函数中SpringApplication.run方法就可以

@SpringBootApplication 分为:

  • @SpringBootConfiguration springboot项目的配置注解,也是组合注解
    建议springboot中使用此注解而非@Configuration

  • @EnableAutoConfiguration 启动自动配置,系统根据项目依赖的jar包自动配置。
    就比如pom文件引入spring-boot-start-web依赖,项目会自动加入tomcat和SpringMVC

  • @ComponentScan 扫描配置,默认扫描@SpringBootApplication所在类同级以及子包
    所以最好放在项目包下面,防止某些配置无法被扫描到

    如果不想自动配置某一项,使用@SpringBootApplication的exclude参数
    like:@SpringBootApplication(exclude={xxx.class}

    再来看一次SpringApplication.run做了什么?是怎么自动配置的?配置文件呢?

    Spring Boot核心-SpringBootApplication自动配置原理

    首先run方法实例化SpringApplication对象 然后调用SpringApplication的run方法

Spring Boot核心-SpringBootApplication自动配置原理
Spring Boot核心-SpringBootApplication自动配置原理

SpringApplication的run方法中继续调用了 getSpringFactoriesInstances 方法

Spring Boot核心-SpringBootApplication自动配置原理

getSpringFactoriesInstances 方法继续调用 loadFactoryNames

点进去

Spring Boot核心-SpringBootApplication自动配置原理

最终看到一个 “META-INF/spring.factories” 的资源文件

最终springboot是通过加载 “META-INF/spring.factories” 文件进行自动配置的

通过源码分析可以看出,SpringBoot是通过SpringFactoryLoader的 loadFactoryNames 方法读取spring.factories文件的
SpringFactoryLoader主要功能是从指定的配置文件加载配置,配合@EnableAutoConfiguration使用,根据EnableAutoConfiguration查找到一组@Configuration类 作为配置文件

所以@SpringBootApplication的自动配置原理便是:

  • 从classpath中搜寻所有的spring.factories配置文件,通过反射将其中@EnableAutoConfiguration对应的配置项实例化为对应>的IoC容器,然后汇总并加载到Spring框架的Ioc容器中