参考: https://www.jianshu.com/u/763c53661578
@SpringBootApplication是一个注解
@SpringBootConfiguration实际上就是@Configuration,说明这是一个JavaConfig
@ComponentScan,启用注解自动扫描
@EnableAutoConfiguration根据类路径中jar包是否存在来决定是否开启某一个功能的自动配置,比如,我们项目中添加了spring-boot-starter-web依赖,因其关联Tomcat和SrpingMVC,所以类路径下就会存在Tomcat和Spring MVC的jar包。扫描jar包里是否含有META-INF/spring.factories文件;并在spring.factories中找到@EnableAutoConfiguration的全路径名称org.springframework.boot.autoconfigure.EnableAutoConfiguration这个key,该key对应的value就是用于声明都需要启用哪些自动配置类。
所有@ConditionalOn开头的注解都是用于进行条件判断的
@ConditionalOnWebApplication:当前项目是web项目的条件下才加载当前配置类
@ConditionalOnClass:当类路径下有指定的类的条件下才加载当前配置类
@ConditionalOnProperty:当指定的属性等于指定的值的情况下加载当前配置类
@ConditionalOnMissingBean:当前容器里没有指定的Bean的情况下
从各个AutoConfiguration配置类中可以看到如下注解,基于这些注解可以确定这些AutoConfiguration的初始化顺序:
@AutoConfigureOrder(-2147483648):数越小越先初始化
@AutoConfigureAfter({EmbeddedServletContainerAutoConfiguration.class}):在指定的配置类初始化后再加载
@AutoConfigureBefore({WebMvcAutoConfiguration.class}):在指定的配置类初始化前加载
· @SpringBootConfiguration实际上就是@Configuration,说明这是一个JavaConfig
· @EnableAutoConfiguration负责扫描jar包中的META-INF/spring.factories来找到要初始化的各种AutoConfiguration类
· 各种@Conditional注解决定哪些Bean可以被容器初始化
exclude和excludeName用于关闭指定的自动配置
scanBasePackages和scanBasePackageClasses用于指定扫描的路径,默认情况下会自动扫描被@SpringBootApplication注解的类(这里是SpringBootWebDemoApplication)的同级包以及子包中的Bean
application.properties文件中debug=true从打印结果中看到,每一个*AutoConfiguration*都对应着一类功能的自动配置类,比如HttpEncodingAutoConfiguration:
内置服务器:tomcat,修改内置Tomcat为Jetty
修改pom,去除spring-boot-starter-tomcat
的依赖,增加spring-boot-starter-jetty
依赖