springboot启动类@SpringBootApplication注解的理解:
@SpringBootApplication就是一个组合注解
其中包含了:
1 . @SpringBootConfiguration : 就是@Configuration注解,代表启动类就是一个配置类.
2. @EnableAutoConfiguration : 帮你实现自动配置的类,SpringBoot工程启动时,会运行一个SpringFactoriesLoader这个类, 加载META-INF/spring.factories配置类 (已经开启的) , 通过SpringFactoriesLoader 中的load方法, 以for循环的方式 ,一个一个加载配置 .
3. @ ComponentScan : 组件包扫描. 扫描启动类的所属包下的所有的组件.(如@Controller)
SpringBoot自动装配的原理:
一 . springboot在启动时会加载大量的自动装配类( XxxAutoConfiguration ) ,但是有的生效了,有的没有生效. 这些自动装配配使用
二 . 我们看我们需要的功能有没有在SpringBoot默认写好的配置类当中;
三. 我们在来看这个自动配置类中到底配置了哪些组件;( 只要我们要用的组件存在其中我们就不需要在手动配置了 )
四 . 给容器中自动配置类添加组件时 , 会从XxxProperties类中获得某些相关的属性.我们只需要在配置文件中指定属性的值即可.
XxxAutoConfiguration: 自动配置类 : 给容器中添加组件
XxxProperties : 封装了配置文件的中的相关属性 : 给组件赋值
总结 : 每一个XxxAutoConfiguration类里面都包含了很多组件bean , 条件成立后都会加载到容器中,这个组件的属性从XxxProperties类中获取 , XxxProperties类中的每一个属性的值, 又和properties进行绑定
简单来说就是 :
=== > springBoot启动
===> 通过SpringFactoriesLoader这个类,加载META-INF/spring.factories ===> spring.factories加载很多的XxxAutoConfiguration类
===> XxxAutoConfiguration中有很多组件,@Conditiona成立后就会被加载到spring容器中
===> 加载到容器后,会从XxxProperties类的属性中获取组件的值
===> 我们可以自定义application.yml对XxxProperties类的属性值进行覆盖.
application.yaml可以写什么?怎么动态修改SpringBoot中的默认的内容的?
在该配置文件中可以配置的东西,都存在一个固有的规律:
1.他一定是xxxProperties的类,
2.在该类中使用@ConfigurationProperties绑定了spring.factories里面的一个XxxAutoConfiguration类
spring.factories的内容:
application.yaml对一个对象属性的配置:
一,首先使用@Component注解表明该对象所属的类为spring的一个组件
二,需要使用@ConfigurationProperties注解标明该类的配置由yaml中哪个prefix而来
三,在yaml文件中使用yaml语法进行属性的一一对应
person:
name: zhangsan
age: 12
birth: 1997/12/25
maps: {k1: v1,k2: v2}
list:
- music
- code
- girls
dog:
name: ok
age: 3
SpringBoot项目中可以写application.yaml的四个位置,其中优先级依次降低
1.项目路径下的config文件夹下
file: ./config/
2.项目路径下的
file: ./
3.类路径下的cnofig文件夹下
classpath: ./config/
4.类路径下( java/resource )的( springBoot项目默认的位置 )
classpath: ./
SpringBoot项目中yaml的多环境配置
spring:
profiles:
active: test
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: test