0


5.SpringBoot⾼级配置

5.1 临时属性配置

可以将java程序打包成jar, 在运⾏jar包的时候传递参数, 具体如下:

1.引入依赖(创建工程时默认引入了)

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

2.使⽤maven中的package进⾏打包

打包完的jar包在target文件夹

3.使用命令行运行jar包,可以传递临时参数

java -jar 工程jar包路径 --变量=参数

4.运⾏项⽬传⼊临时参数配置说明

优先级在官⽅⽂档可⻅

     **原因:**

** **在springboot的引导类的main方法中有一个args参数列表,它会传递给run方法,替换原来的在application.yml中的配置。如果删除这个args就无法传递临时变量

5.2 配置⽂件优先级

SpringBoot提供的4级配置⽂件中的其中⼀个级别。4个级别分别是:

  • 类路径下配置⽂件(⼀直使⽤的是这个,也就是resources⽬录中的application.yml⽂件)
  • 类路径下config⽬录下配置⽂件
  • 程序包所在⽬录中配置⽂件
  • 程序包所在⽬录中config⽬录下配置⽂件

上⾯4个⽂件的加载优先顺序为

  1. file :config/application.yml 【最⾼】
  2. file :application.yml
  3. classpath:config/application.yml
  4. classpath:application.yml 【最低】

SpringBoot会从这四个位置全部加载主配置⽂件,如果⾼优先级中配置⽂件属性与低优先级配置⽂件不冲突的属性,则会共同存在— 互补配置。

SpringBoot会加载全部主配置⽂件;互补配置:

备注:
这⾥说的配置⽂件,都还是项⽬⾥⾯。最终都会被打进jar包⾥⾯的,需要注意。
1、如果同⼀个⽬录下,有application.yml也有application.properties,默认先读取application.properties。
2、如果同⼀个配置属性,在多个配置⽂件都配置了,默认使⽤第1个读取到的,后⾯读取的不覆盖前⾯读取到的。
3、创建SpringBoot项⽬时,⼀般的配置⽂件放置在“项⽬的resources⽬录下”

5.3 多环境开发

项⽬在部署的时候,可能存在多个环境,我们有开发环境,测试环境,正式环境,但是配置都不相同,因此为了解决多环境配置⽂件不同的问题,我们可以有多个配置⽂件,来对不同的环境进⾏满⾜。

多环境开发

每个配置⽂件中写⾃⼰的配置,主配置⽂件中写清楚⽤哪⼀个配置⽂件就好了。

其他环境配置⽂件(例如开发dev、测试test、生产pro)

    ⽂件的命名规则为:application-环境名.yml。

⽐如⽣产环境配置如下:

    application-pro.yml
spring:
# 给配置文件命名
  config:
    activate:
      on-profile: pro
# 或者(可使用,但是已被弃用,不推荐)
  profiles: pro

主配置⽂件 application.yml

spring:
  profiles:
    #  使用一个配置文件pro
    active: pro
  #    或者
  config:
    activate:
      on-profile: pro

在配置⽂件中,如果某些配置项所有环境都⼀样,可以将这些项写⼊到主配置中,只有哪些有区别的项才写⼊到环境配置⽂件中。

  • 主配置⽂件中设置公共配置(全局)
  • 环境分类配置⽂件中常⽤于设置冲突属性(局部)
  • 可以使⽤独⽴配置⽂件定义环境属性
  • 独⽴配置⽂件便于线上系统维护更新并保障系统安全性

多环境开发配置⽂件规则

配置⽂件中的信息进⾏拆分,并制作成独⽴的配置⽂件,命名规则如下

  • application-devDB.yml
  • application-devRedis.yml
  • application-devMVC.yml

⽅式1:

    使⽤include属性在激活指定环境的情况下,同时对多个环境进⾏加载使其⽣效,多个环境间使⽤逗号分隔,include后面按序优先级递增(下面devMVC优先级最高)。include与active组合使用,include优先级高
spring:
  profiles:
# 使用多个配置文件
    include: devDB,devRedis,devMVC

⽅式2:

    SpringBoot从2.4版开始使⽤group属性替代include属性,降低了配置书写量。
spring:
  profiles:
    active: dev
    group:
      "dev": devDB,devRedis,devMVC
      "pro": proDB,proRedis,proMVC
      "test": testDB,testRedis,testMVC

5.4 @ConfigurationProperties⾼级配置

如果使用@ConfigurationProperties注解报错:

需要引入一个依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

给⾃定义的bean加载属性值

注解@ConfigurationProperties指定该对象加载哪⼀组yaml中配置的信息,为bean绑定属性。

为第三⽅bean加载属性

步骤①:使⽤@Bean注解定义第三⽅bean

@Bean
public DruidDataSource datasource(){
    DruidDataSource ds = new DruidDataSource();
    return ds;
}

步骤②:在yml中定义要绑定的属性

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver

步骤③:使⽤@ConfigurationProperties注解为第三⽅bean进⾏属性绑定,注意前缀是全⼩写的datasource

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource datasource(){
        DruidDataSource datasource = new DruidDataSource();
        return datasource;
}
    @ConfigurationProperties注解不仅能添加到类上,还可以添加到⽅法上,添加到类上是为spring容器管理的当前类的对象绑定属性,添加到⽅法上是为spring容器管理的当前⽅法的返回值对象绑定属性,其实本质上都⼀样。

哪些bean通过注解@ConfigurationProperties去绑定属性了

spring给我们提供了⼀个全新的注解,专⻔标注使⽤@ConfigurationProperties注解绑定属性的bean是哪些。这个注解叫做@EnableConfigurationProperties。

使用步骤:

步骤①:在引导类上开启@EnableConfigurationProperties注解,并标注要绑定属性的类

@SpringBootApplication
@EnableConfigurationProperties(UserInfo.class)
public class SpringbootConfigurationApplication {
}

步骤②:在对应的类上直接使⽤@ConfigurationProperties进⾏属性绑定

@Data
@ConfigurationProperties(prefix = "servers")
public class UserInfo {
    private String ip;
    private int port;
}

使⽤@EnableConfigurationProperties注解时,spring会默认将其标注的类定义为bean,因此⽆需再次声明@Component注解了。

总结

  1. 使⽤@ConfigurationProperties可以为使⽤@Bean声明的第三⽅bean绑定属性
  2. 当使⽤@EnableConfigurationProperties声明进⾏属性绑定的bean后,⽆需使⽤
    @Component注解再次进⾏bean声明

5.5 松散绑定

宽松绑定:实际上是springboot进⾏编程时⼈性化设计的⼀种体现,即配置⽂件中的命名格式与变量名的命名格式可以进⾏格式上的最⼤化兼容。

在yml配置文件中不管你用下面哪一种命名方式,都会去掉非字母字符转换成小写,从而绑定到类

@Data
@ConfigurationProperties(prefix = "userinfo")//必需全部小写才能绑定。不管配置文件中如何命名
public class UserInfo {
private String ip;
private int port;
}

userinfo:
userId: zhangsan # 驼峰模式
user_id: zhangsan # 下划线模式
user-id: zhangsan # 烤⾁串模式
USER_ID: zhangsan # 常量模式

以上4种模式最终都可以匹配到userId这个属性名 ,springboot官⽅推荐使⽤烤⾁串模式,也就是中划线模式。

总结

  1. @ConfigurationProperties绑定属性时⽀持属性名宽松绑定,这个宽松体现在属性名的命名规则上
  2. @Value注解不⽀持松散绑定规则
  3. 绑定前缀名推荐采⽤烤⾁串命名规则,即使⽤中划线做分隔符

5.6 数据校验

SpringBoot给出了强⼤的数据校验功能,可以有效的避免此类问题的发⽣。在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据⾃⼰的需要选择对应的校验框架,此处使⽤Hibernate提供的校验框架来作为实现进⾏数据校验。

1.开启校验框架

<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>

2.在需要开启校验功能的类上使⽤注解@Validated开启校验功能

@Component
@Data
@ConfigurationProperties(prefix = "userinfo")
//开启对当前bean的属性注⼊校验
@Validated
public class UserInfo {
}

3.对具体的字段设置校验规则

@Component
@Data
@ConfigurationProperties(prefix = "userinfo")
@Validated
public class UserInfo {
    //设置具体的规则
    @Max(value = 100,message = "最⼤值不能超过100")
    @Min(value = 0,message = "最⼩值不能低于0")
    private int id;
    
    @Size(max=5 ,min=2.message="address超过范围了")
    private String address;
}

通过设置数据格式校验,就可以有效避免⾮法数据加载,其实使⽤起来还是挺轻松的,基本上就是⼀个格式。

标签: spring boot java spring

本文转载自: https://blog.csdn.net/m0_62520968/article/details/126724953
版权归原作者 捣蛋孩学编程 所有, 如有侵权,请联系我们删除。

“5.SpringBoot⾼级配置”的评论:

还没有评论