SpringBoot
00 应用入口
@SpringBootApplication是一个组合注解,包括
-
@Configuration
-
@EnableAutoConfiguration
根据类路径中的jar包依赖为当前项目进行自动配置,如添加了spring-boot-starter-web依赖,会自动添加Tomcat和spring mvc的依赖,那么spring boot会对tomcat和spring mvc进行自动配置
-
@ComponentScan
自动扫描@SpringBootApplication所在类的同级包以及下级包里的Bean,所以入口类基本建议配置在groupID和arctifactID组合的包名下
01 配置文件
全局配置文件application.properties或者application.yml,在src/main/resources目录或者类路径的/config下
02 Spring boot启动
通过getSpringFactoriesInstances方法,通过SPI机制,读取了一堆配置
spring.factories文件中定义的ApplicationContextInitializer/ApplicationListener/Bootstrapper/BootstrapRegistryInitializer类的一些实现
Springboot默认提供了两个spring.factories文件,分别位于spring-boot.jar和spring-boot-autoconfigure.jar的META-INF/下
即在创建SpringApplication示例的时候,会加载一些初始化和启动的参数与类
spring启动过程分为多个阶段,每完成一步产生一个事件,并调用对应事件的监听器,是一种标准的观察者模式,在启动过程中有很好的扩展性

03 配置文件加载顺序
配置文件加载优先级
优先级高的会覆盖低的, 也可以理解他们的加载时机是顺序相反的!
下面优先级从1-6,加载顺序是从6到1
-
启动时指定某些参数 >
java -jar app.jar --server.port=9999 -
启动时指定配置文件(有坑:互补失效!)
java -jar app.jar -spring.config.location=/mydir/application.properties -
jar同目录的config/application.properties
app.jar 同级别目录下的 ./config/application.properties
-
jar同目录的application.properties
app.jar同级别目录下的 application.properties
-
jar内部 classpath目录下的 ./config/application.properties
app.jar/BOOT-INF/classes/config/application.properties
-
jar内部classpath目录下的 application.properties
app.jar/BOOT-INF/classes/application.properties
多环境加载
基础的application和application-xxx都会被加载,xxx优先级高,会覆盖无xxx的同名属性。
一般在application.proerties里通过
spring.profiles.active=dev来确定加载哪个环境的配置文件,也可以看上面,通过命令行--spring.profiles.active=xxx来指定
同一目录下,properties和yml共存
properties优先级高,yml内容会被覆盖
先加载yml,再加载properties,后加载的覆盖前面同名的属性。
04 springcloud Eureka注解
@EnableDiscoveryClient和@EnableEurekaClient 跟springcloud版本有关
Spring Cloud版本:Angle -> Brixton -> Camden -> Dalston -> Edgware -> Finchley
前者是通用的,不论使用哪种注册中心,都可以注册
后者专门用于eureka作为注册中心的情况,建议使用前者
在Spring Cloud的Dalston及其之前的版本中: 1、从2014年的Spring Cloud 1.0.0.RC1版本开始,官方就推荐使用EnableDiscoveryClient来取代EnableEurekaClient。 2、EnableEurekaClient源码中使用了注解EnableDiscoveryClient,因此如果要使用eureka的注册发现服务,两者功能是一样的。 3、EnableDiscoveryClient注解在spring.factories配置中通过配置项EurekaDiscoveryClientConfiguration来开启服务注册发现功能;
在Dalston之后的版本中(不含Dalston): 1、在spring.factories配置中,配置类EurekaDiscoveryClientConfiguration被配置到springboot的自动配置注解中,与EnableDiscoveryClient注解没有关系了,也就是说只要开启了springboot的自动配置,服务注册发现功能就会启用。 2、 EnableEurekaClient源码中没有使用注解EnableDiscoveryClient,此时EnableEurekaClient已经没用了。
05 spring boot通过命令行设置属性
在命令行运行时,连续的两个减号–就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888,该设置在样例工程中可见,读者可通过删除该值或使用命令行来设置该值来验证。
通过命令行来修改属性值固然提供了不错的便利性,但是通过命令行就能更改应用运行的参数,那岂不是很不安全?是的,所以Spring Boot也贴心的提供了屏蔽命令行访问属性的设置,只需要这句设置就能屏蔽:SpringApplication.setAddCommandLineProperties(false)。
参考 :使用 spring.profiles.active来区分配置
06 spring boot导入外部资源
如果有下列的情况, 就需要用到@ImportResource来帮忙了:
- 有一个遗留的xml文件, 比如名叫
spring-beans.xml里面有很多的配置bean, 都需要注册到spring容器中, 让容器来管理这些bean以备不时之需; - 传统springmvc的项目, 原来的xml配置文件不想删除, 但是又想用springboot来改造它; 就可以使用 @ImportResource来 导入外部资源
简言之: 就是还想用xml, 还想用 springboot; xml就由此注解来注册进去!
启动类上加注解: @ImportResource("classpath:/spring/spring-*.xml")
07 spring boot自动装配
spring boot在启动时,会扫描外部引用jar包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到spring容器中(就是按照配置的类型信息,new对象丢到spring容器中),并执行类中定义的各种操作。
文件内容一般是:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
...
spring boot的自动配置代码
org.springframework.boot:spring-boot-autoconfigure:{version}下的META-INF/spring.factories
里边key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的属性下,有非常多要自动配置的类,这些类很多都是springboot官方提供的starter里的配置类。
这么多配置类,都要实例化吗?
自动配置类里有一些Conditionalxxx注解,用来判断是否实例化这些类。
-
@ConditionalOnClass(xxx.class)只有路径中有xxx类时,才会自动装配此配置类,即你得引入xxx所在的starter,springboot才会自动装配此配置类
-
@ConditionalOnMissingBean(type="xxx.yyy")如果自己定义了yyy类,那springboot就会放弃帮你自动装配。即如果yyy类确实(没有自己定义)那么springboot就自动帮你装配。
-
@EnableConfigurationProperties(xxx.class)xxx类中的属性,就是在application.properties里可以支持配置的属性。