03spring-boot-config-demo

序言

本模块会展示几种spring-boot的一些基础配置。

全局配置文件

在src/main/resources目录下,Spring Boot提供了一个名为application.properties的全局配置文件(也可以改成yml的格式进行配置),可对一些默认配置的配置值进行修改。

附:application.properties中可配置所有官方属性

修改默认配置

首先我们新建一个controller,然后随便写点什么,然后启动项目

@RestController
public class HelloController {
    @GetMapping("/say/hello")
    public String sayHello() {
        return "hello";
    }
}

此时访问http://localhost:8080/say/hello此地址即可看见返回值,那么如果我们想修改我们项目启动时的端口,只需要在全局配置文件中(application.yml)增加如下配置即可

server:
  port: 8081

此时在进行启动,即可发现端口已经变成8081了。

自定义属性值

Spring Boot允许我们在application.yml下自定义一些属性,比如:

person:
  name: 张三
  age: 18

我们如果要对自定义的配置进行使用,可以通过@Value和@ConfigurationProperties来配置。

@Value

下面我们来使用@Value来进行刚刚配的自定义属性值的取值。

首先进行代码的改造,将刚才的controller改成如下样子

@RestController
public class HelloController {

    @Value("${person.name}")
    String name;
    @Value("${person.age}")
    Integer age;

    @GetMapping("/say/hello")
    public String sayHello() {
        return "hello" + name + ",我今年" + age + "岁了";
    }
}

启动,然后访问http://localhost:8081/say/hello,可以看到如下效果

在这里插入图片描述

到这,我们就完成了@Value最简单的使用了,接下来我们来学习一下@Value的一些用法。

  • @Value的默认值

    @Value("${person.name:李四}")
    

    此时,如果配置文件中没有配置person.name这个属性,那么此注解注入的值就为李四。

  • @Value注入静态变量

    首先我们先这样子改造controller,然后访问/say/hello/static这个路径时,会发现返回了hellonull。

    @RestController
    public class HelloController {
        @Value("${person.name}")
        static String staticName;
        
        @GetMapping("/say/hello/static")
        public String sayHelloStatic() {
            return "hello" + staticName;
        }
    }
    

    那么如果我们想使用@Value注解注入静态变量时,应该怎么办呢。

    @RestController
    public class HelloController {
        static String staticName;
    
        @Value("${person.name}")
        public void setStaticName(String staticName){
            HelloController.staticName = staticName;
        }
        
        @GetMapping("/say/hello/static")
        public String sayHelloStatic() {
            return "hello" + staticName;
        }
    }
    

    这样子改造后,即可对静态字段进行赋值。

当然@Value还有很多用法,不过不太常用,这里就不在进行介绍了。

@ConfigurationProperties

在获取配置值中,项目中更常用的是@ConfigurationProperties注解,下边我们来学习以下该注解的用法。首先我们还是通过一个例子,来学一下@ConfigurationProperties最简单的用法。

首先我们建一个Person实体类,然后对其注入配置文件的属性。

@Data
@ConfigurationProperties(prefix = "person")
@Component
public class Person {
    private String name;
    private Integer age;
}

然后改造controller

@RestController
public class HelloController {
    @Autowired
    Person person;

    @GetMapping("/say/hello/person")
    public String sayHelloPerson() {
        return "hello" + person;
    }
}

这样,访问/say/hello/person即可看见自定义配置的属性已经被注入到Person实体类中了。

下边来学习@ConfigurationProperties的详细用法。

  • 激活@ConfigurationProperties的三种方式

    首先,我们对一个配置类添加@ConfigurationProperties(prefix = “person”)这个注解时,想要让spring帮助我们注入相关配置,我们需要告诉spring我们在这配置了@ConfigurationProperties

    1.第一种方式就是刚才例子里的,直接给类上添加@Component,让Component Scan扫描到。

    @Data
    @ConfigurationProperties(prefix = "person")
    @Component
    public class Person {
        private String name;
        private Integer age;
    }
    

    2.第二种方式,是通过@Bean+@ConfigurationProperties实现

    @Configuration
    public class PropertiesConfig {
        @Bean
        @ConfigurationProperties(prefix = "person")
        public Person1 getPerson1() {
            return new Person1();
        }
    }
    

    3.第三种方式,则是使用@EnableConfigurationProperties注解将其导入。

    @EnableConfigurationProperties({Person3.class})
    

    如果@ConfigurationProperties是在第三方包中,那么@Component是不能注入到容器的。只有@EnableConfigurationProperties才可以注入到容器。以上3种方式,根据需要可灵活使用。

  • @ConfigurationProperties的常见参数

    1. ignoreInvalidFields

      这个参数的默认值是false,这个参数的意思是,如果我们为属性配置错误的值时,项目启动会报错,比如,对Boolean的属性值配了值为test的变量。那么如果我们希望即使我们为属性配置错误的值时也希望spring boot应用启动成功,我们可以设置ignoreInvalidFields为true。

      @ConfigurationProperties(prefix = "person", ignoreInvalidFields=true)
      
    2. ignoreUnknownFields

      这个参数的默认值是true,这个参数的意思是,默认情况下,springboot会忽略掉那些不能绑定到@ConfigurationProperties类字段的属性,比如Person类字段有name和age,然后配置文件中配置了person.sex = 男,默认情况下启动是不会报错的。如果我们希望配置文件中如果有多配置的属性则应用启动失败,可以将ignoreUnknownFields设置为false

      @ConfigurationProperties(prefix = "person", ignoreUnknownFields=false)
      
  • 启动时校验@ConfigurationProperties

    字段上添加 bean validation 注解,同时在类上添加 @Validated 注解,如下

    @Data
    @Component
    @ConfigurationProperties(prefix = "person")
    @Validated
    public class Person {
        @NotBlank private String name;
        @NotNull private Integer age;
    }
    
  • 使用@ConfigurationProperties的注意事项

    • 前缀定义了哪些外部属性将绑定到类的字段上

    • 根据 Spring Boot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配

      person.userName
      person.username
      person.user_name
      person.user-name
      person.USER_NAMA
      以上配置均会被绑定到userName属性上,此为sping的宽松绑定原则
      
    • 我们可以简单地用一个值初始化一个字段来定义一个默认值

    • 类本身可以是包私有的

    • 类的字段必须有公共 setter 方法

自定义配置文件

除了spring默认的application.properties配置文件,我们很多时候,会将一些配置抽出来自定义一个配置文件。例如,在src/main/resources目录下新建一个test.properties,然后使用@PropertySource注解配合@ConfigurationProperties注解来实现自定义配置文件的属性注入。

person.name = 小舞
person.age = 55
@Data
@Component
@PropertySource(value = "test.properties")
@ConfigurationProperties(prefix="person")
public class Person {
    private String name;
    private Integer age;
}

通过命令行设置属性值

在运行Spring Boot jar文件时,可以使用命令java -jar xxx.jar --server.port=8081来改变端口的值。这条命令等价于我们手动到application.properties中修改(如果没有这条属性的话就添加)server.port属性的值为8081。

如果不想项目的配置被命令行修改,可以在入口文件的main方法中进行如下设置:

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(Application.class);
    application.setAddCommandLineProperties(false);
    application.run(args);
}

Profile配置

Profile用来针对不同的环境下使用不同的配置文件,多环境配置文件必须以application-{profile}.properties的格式命,其中{profile}为环境标识。比如定义两个配置文件:

  • application-dev.properties:开发环境

    server.port=8080
    
  • application-prod.properties:生产环境

    server.port=8081
    

至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。

file}.properties的格式命,其中{profile}`为环境标识。比如定义两个配置文件:

  • application-dev.properties:开发环境

    server.port=8080
    
  • application-prod.properties:生产环境

    server.port=8081
    

至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。

如:spring.profiles.active=dev就会加载application-dev.properties配置文件内容。可以在运行jar文件的时候使用命令java -jar xxx.jar --spring.profiles.active={profile}切换不同的环境配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值