属性注入
当使用 Spring Boot 开发应用程序时,可以使用属性文件来配置应用程序的行为。Spring Boot 支持将属性值从属性文件注入到应用程序中的不同组件中。这使得我们可以在不修改代码的情况下更改应用程序的行为。
Spring Boot 支持多种类型的属性文件,包括 .properties
和 .yml
文件。以下是使用这些文件进行属性注入的示例:
- 创建属性文件:首先,创建一个名为 application.properties(或 application.yml)的文件,放在 src/main/resources 目录下。该文件包含要配置的属性键值对。
- 定义属性:在属性文件中,可以定义应用程序需要的各种属性。例如,可以定义数据库连接的URL、用户名、密码等。
author: name: 薛伟 age: 25 isMan: true # 日期格式必须为 yyyy/MM/dd HH:mm:ss birthday: 1999/07/29 12:00:00 # 数组或集合使用 , 分割 friends: 张三,李四,王五,赵六 # 此处为 JSON 字符串,双引号包裹 school: "{'name':'宜春学院', 'location':'江西-宜春', 'major':'计算机科学与技术'}"
注入属性值:在 Spring Boot 应用程序的代码中,可以通过使用 @Value 注解将属性值注入到变量中。
@SpringBootTest public class InjectionTest { /** * 注入基本数据类型 */ @Value("${author.name}") private String name; @Value("${author.age}") private Integer age; @Value("${author.isMan}") private Boolean isMan; /** * 注入日期 */ @Value("${author.birthday}") private Date birthday; /** * 注入数组或集合 */ @Value("${author.friends}") private List<String> friends; /** * 注入 JSON 转为 Map */ @Value("#{${author.school}}") private Map<String,Object> school; }
对象注入
使用 @ConfigurationProperties(prefix = "前缀")
,比如上文在 application.yml
中配置的信息,那么 author
就是前缀。注意使用对象注册的时候就不可以在注入 JSON 了。
@Data @Component @ConfigurationProperties(prefix = "author") public class Author { private String name; private Integer age; private Date birthday; private Boolean isMan; private List<String> friends; }
自定义配置文件并使用对象注入
在 Spring Boot 应用程序中,可以使用自定义配置文件来覆盖默认的 application.properties 或 application.yml 文件。这意味着您可以在不修改默认配置文件的情况下,为您的应用程序提供自己的自定义配置。
在 resources
目录下创建 custom.properties
配置文件,并填写以下配置:
project.name=测试DEMO project.jdk=1.8
加载自定义配置文件:在 Spring Boot 应用程序中,可以通过使用 PropertySource 注解加载自定义配置文件。
@Data @Component @PropertySource("classpath:/custom.properties") public class MyProject { @Value("${project.name}") private String name; @Value("${project.jdk}") private String jdk; }
然后配合 @ConfigurationProperties(prefix = "前缀")
即可完成对象注入。
@Data @Component @ConfigurationProperties(prefix = "project") @PropertySource("classpath:/custom.properties") public class Project { private String name; private String jdk; }