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做了什么?是怎么自动配置的?配置文件呢?
首先run方法实例化SpringApplication对象 然后调用SpringApplication的run方法
SpringApplication的run方法中继续调用了 getSpringFactoriesInstances 方法
getSpringFactoriesInstances 方法继续调用 loadFactoryNames
点进去
最终看到一个 “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容器中