自学尚硅谷Spring Boot (三)

一、Profile

1.多Profile文件

我们在主配置文件编写的时候,文件名可以是  application-{profile}.properties.yml

默认使用application.properties的配置;

2.yml支持多文档快方式


server:
  port: 8081
spring:
  profiles:
      active: prod
---

server:
  port: 8083
spring:
  profiles: dev

---
server:
  port: 8084
spring:
  profiles: prod     #指定属于哪个环境
---

3.激活指定profile

   1.在配置文件中指定 spring.profiles.active=dev

   2.命令行:

          --spring.profiles.active = dev

f5eb08d900be5a3638a4c04167e4106c7ff.jpg

e5e3a1290c09954c8ff2c221029b175ce71.jpg

3.虚拟机参数:

    -Dspring.profiles.active=dev

   7e22bf771615ccfb034e769c2218519e17f.jpg

二、配置文件加载位置

springboot启动会扫描一下位置的application.properties或者application.yml文件作为Springboot的默认文件

-file:/config/

-file:.../config/

-classpath:/config/

-classpath:/

优先级由高到低,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部加载主配置文件:互补配置;

我们还可以通过spring.config.location来改变默认位置

项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来制定配置文件的新位置,指定配置文件和默认加载的这些配置文件共同起作用形成互补配置

三、外部配置加载顺序

springboot也可以从以下位置加载配置;优先级从高到低;高优先级的配置的覆盖低优先级的配置,所有的配置会形成互补配置;

1.命令行参数

java -jar springboot-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

多个配置用空格分开;--配置项=值

2.来自java:comp/env的NDI属性

3.Java系统属性(System.getProperties())

4.操作系统环境变量

5.RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找

优先加载带profile

6.jar外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

7.jar内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

再来加载不带profile

8.jar外部的application-{profile}.properties或application.yml(不带spring.profile)配置文件

9.jar内部的application-{profile}.properties或application.yml(不带spring.profile)配置文件

10.@Configuration注解类上的@PropertySource

11.通过SpringApplication.setDefaultProperties指定的默认属性

所有支持的配置加载来源;

参考官方文档

四、自动配置原理

配置文件到底能写什么?什么写?自动配置原理;

配置文件能配置的属性参照官方文档

自动配置原理:

1.springboot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

2.@EnableAutoConfiguration 作用:

           利用AutoConfigurationImportSelector给容器中导入一些组件?

           可以查看selectImports()方法的内容

           List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

                SpringFactoriesLoader.loadFactoryNames()

                扫描所有jar包来路径下   META-INF/spring.factories

                把扫描到的这些文件的内容包装成properties对象

                从properties中获取到EnableAutoConfiguration.class类(类名)对应的的值

           将类路径下的META-INF/spring.factories里面配置的所有的EnableAutoConfiguration的值都加入到了容器中

          每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置;

3.每一个自动配置类进行自动配置功能;

4.以HttpEncodingAutoConfiguration(HTTP编码自动配置)为例解释自动配置原理

@Configuration     //表示这是个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties({HttpEncodingProperties.class})     //启动指定类的@EnableConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到IOC容器中
@ConditionalOnWebApplication(      //Spring底层@Conditional注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;    判断当前应用是否是web应用,如果是,当前配置类生效,
    type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class})      //判断当前项目有没有这个类CharacterEncodingFilter:SpringMVC中进行乱码解决的过滤器
@ConditionalOnProperty(
    prefix = "spring.http.encoding",
    value = {"enabled"},
    matchIfMissing = true
)             // 判断配置文件中是否存在某个配置spring.http.encoding.enabled;如果不存在,判断也是成立的
       //即使我们配置文件中不配置spring.http.encoding.enabled = true,也是默认生效的
public class HttpEncodingAutoConfiguration {


//他已经和Springboot配置映射了
private final HttpEncodingProperties properties;


//只有一个有参构造器的情况下,参数的值就会从容器中拿
 public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }





 @Bean           //给容器中添加一个组件,这个组件的某些之需要从properties中获取
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.RESPONSE));
        return filter;
    }

根据当前不同的条件判断,决定这个配置类是否生效?

一旦这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

5.所有在配置文件中能配置的属性都是在xxxProperties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类

@ConfigurationProperties(
    prefix = "spring.http.encoding"
)                                       //从配置文件中获取制定的值和bean的属性进行绑定
public class HttpEncodingProperties {

精髓:

    1.springboot启动会加载大量的自动配置类

    2.我们看我们需要的功能有没有Springboot默认写好的自动配置类;

    3.我们再来看这个自动配置类中到底配置了那些组件;(只要我们用的组件有,我们就不需要配置了)

    4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值

 

xxxAutoConfiguration:自动配置类;

给容器中添加组件

xxxProperties:封装配置文件中相关属性;

 

转载于:https://my.oschina.net/u/3669883/blog/2242034

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值