序言
本模块会展示几种spring-boot的一些基础配置。
全局配置文件
在src/main/resources目录下,Spring Boot提供了一个名为application.properties的全局配置文件(也可以改成yml的格式进行配置),可对一些默认配置的配置值进行修改。
修改默认配置
首先我们新建一个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的常见参数
-
ignoreInvalidFields
这个参数的默认值是false,这个参数的意思是,如果我们为属性配置错误的值时,项目启动会报错,比如,对Boolean的属性值配了值为test的变量。那么如果我们希望即使我们为属性配置错误的值时也希望spring boot应用启动成功,我们可以设置ignoreInvalidFields为true。
@ConfigurationProperties(prefix = "person", ignoreInvalidFields=true)
-
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}
切换不同的环境配置。