spring boot的学习--Springboot配置文件(2)

1.springboot的热部署

   1.1 作用: spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。

  1.2 需要引入依赖

     

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-devtools</artifactId> 
    <optional>true</optional> 
</dependency>

修改java代码或者配置文件模版后可以通过ctrl+f9来实现热部署

2. 配置文件

 2.1  springboot使用一个全局的配置文件,配置文件名是固定的(application.properties或者application.yml)

 2.2 配置文件的作用:修改spring boot自动配置的默认值;springboot在底层都给我们自己配置好

2.3 和以前xml配置文件的区别:以前大多都使用的是xxx.xml文件

        yml 以数据为中心,比json,xml等更适合做配置文件

                             

3. yaml的语法

3.1 基本语法

   k:(空格)v:表示一对键值对(注意空格是必须要有的)

   以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

   注意: 属性和值也是大小写敏感的

server:
    port: 8081
    path: /hello

 3.2 值的写法

      字面量:普通的值(数字,字符串,布尔)

      直接按照 k: v的形式写就可以

      字符串默认不用加入单引号或者双引号[如果字符串不包含特殊字符(如冒号 :、逗号 ,、换行符等),则可以直接书写。]

      当加入双引号时不会转义字符例如"a\nb" 代表的是 a\nb

      当加入单引号时会转义字符例如'a\nb' 代表的是a(回城)n

 3.3 对象,Map(属性和值)(键值对):

     k: v:在下一行来写对象的属性和值的关系,注意缩进!!!

     对象还是k:v的方式

       

     数组(List,Set):用-值表示数组中的一个元素

     

      

4. 配置文件值注入

 4.1 配置文件

4.2 javaBean

4.3 @configurationProperties(prefix = "person")

     4.3.1 作用:将配置文件中的配置的每一个属性的值,映射到这个组件中

     4.3.2 @configurationProperties 是告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定;

     4.3.3 prefic = "person":配置文件中哪个下面的所有属性进行一一映射

     4.3.4 注意容易错的!!:只有当这个组件是容器中的组件,才能容器提供的 @configurationProperties功能,也就是说必须加上类似(@component,@commction,@service这种)

5. spring-boot-configuration-processor依赖的作用

   5.1.1 作用:为了方便提供了一个生成配置的元数据信息的依赖

                即当我们在javaBean中写了属性,在application.yml编辑的时候会提示如下图

<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring‐boot‐configuration‐processor</artifactId>
     <optional>true</optional>
</dependency>

6.使用时可能遇到的问题

6.1  properties配置文件在idea中默认utf-8可能会乱码

   解决:修改idea中的配置格式就好 (File—>Settings------>Editor------>File Encodings)

7.此外使用@value也可以进行获取值

1.例如:

   1.1application.properties 文件内容: 

        app.name=My Application
        app.version=1.0.0

       1.2 使用

        @Component
        public class MyComponent {
            @Value("${app.name}")
            private String appName;
        
            @Value("${app.version}")
            private String appVersion;
        
            // 其他类成员和方法
        }

   1.3 @Value和@ConfigurationProperties获取值比较  

重点: 无论配置文件是yml还是proerties,他们都能获取到值

    如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,则使用

    如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties

3. @value中的#和$的区别(还可以什么都不加直接复制)

     3.1 #:其实是Spring Expression Language (SpEL)表达式,可以在注入属性前进行一些简单的计算等逻辑。  

     例如:

  

   

@Value注解的作用主要可以给属性直接赋值、也可以读取配置文件中的值给属性赋值。

   例如:

8. @ImportResource的作用

 8.1 作用: 导入spring的配置文件,让配置文件里面的内容生效

       由于Springboot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别

       想让spring的配置文件生效,加载进来;@I,portResource标注在一个配置类上

    SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
        1、配置类@Configuration------>Spring配置文件
        2、使用@Bean给容器中添加组件

/**
* @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件
*
* 在配置文件中用<bean><bean/>标签添加组件
* *
/
@Configuration
public class MyAppConfig {
     //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
     @Bean
     public HelloService helloService02(){
         System.out.println("配置类@Bean给容器中添加组件了...");
         return new HelloService();
     }
}

9. 配置文件占位符

   9.1 随机数

        ${random.value}${random.int}${random.long}
        ${random.int(10)}${random.int[1024,65536]}

  9.2  占位符获取之前配置的值,如果没有可以是用:指定默认值

   

person.last‐name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

10. Profile

 10.1 多Profile文件

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

     默认是使用applicatio.properties来进行配置的

 10.2 yml支持多文档块方式

 

  10.3 激活指定的profile

      10.3.1 在application.properties中指定spring.profiles.active=dev(配置文件方式)

      10.3.2 使用命令java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;可以直接在测试的时候,配置传入命令行参数(命令行方式)

      10.3.3 虚拟机参数;-Dspring.profiles.active=dev

11. 配置文件加载位置

   11.1 springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

  1. file:./config/:当前目录的 config 子目录。
  2. file:./:当前目录。
  3. classpath:/config/:类路径下的 config 包。
  4. classpath:/:类路径的根目录。

     优先级又高到低,高优先级的配置会覆盖低优先级的配置;SpringBoot会从这四个位置全部加载主配置文件;互补配置;

    注意:优先级是指属性最后使用的值,而不是说仅仅扫描优先级高的路径,不是发现了         application.properties文件就停止。例如classpath:/config/和file:./config/都存在配置文            件 ,那么加载过程会加载classpath:/config/路径下配置文件的所有属性,然后再加载              file:./config/路径下配置文件的属性并替换已有的属性。此外,如果你在相同优先级位置          同时有application.properties和application.yml,那么application.yml里面的属性就会覆          盖application.properties里的属性。

          

12.自动配置原理

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

12.2 @EnableAutoConfiguration的作用

       12.2.1 利用EnableAutoConfigurationImportSelector给容器中导入一些组件

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

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

    以HttpEncodingAutoConfigurationHttp编码自动配置)为例解释自动配置原理;

@Configuration //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties(HttpEncodingProperties.class) //启动指定类的
ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把
HttpEncodingProperties加入到ioc容器中
@ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnClass(CharacterEncodingFilter.class) //判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing =true) //判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
public class HttpEncodingAutoConfiguration {
      //他已经和SpringBoot的配置文件映射了
      private final HttpEncodingProperties properties;
      //只有一个有参构造器的情况下,参数的值就会从容器中拿
      public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
         this.properties = properties;
      }
 @Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?
public CharacterEncodingFilter characterEncodingFilter() {
       CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
       filter.setEncoding(this.properties.getCharset().name());
       filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
       filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
       return filter;
}

注意: 根据当前不同的条件判断,决定这个配置类是否生效
         一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

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

   例如:

@ConfigurationProperties(prefix = "spring.http.encoding") //从配置文件中获取指定的值和bean的属性进行绑定
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值