SpringBoot从配置文件中获取属性的方法

方式一:@Value

基本类型属性注入,直接在字段上添加@Value("\${xxx.xxx}")即可.注意这里用的是$,而不是#,@Value注入的属性,一般其他属性没有关联关系。

配置文件

yml 复制代码
user:
  name: Manaphy
  age: 19
  sex: male
java 复制代码
@RestController
public class ConfigPropertiesController {
    @Value("${user.name}")
    private String name;
    @Value("${user.age}")
    private Integer age;
    @Value("${user.sex}")
    private String sex;

    @GetMapping("/user")
    public String getUser() {
        return "{name:" + name + ",age:" + age + ",sex:" + sex + "}";
    }
}

方式二:@ConfigurationProperties

配置文件

yml 复制代码
person:
  lastName: hello
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {k1: v1,k2: v2}
  lists:
    - lisi
    - wangwu
  dog:
    name: 小狗
    age: 12

JavaBean

java 复制代码
/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
 * prefix = "person":配置文件中哪个下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
 */
@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;

}

@Data
class Dog {
    private String name;
    private Integer age;
}

Controller层

java 复制代码
@RestController
public class PersonController {
    @Autowired
    private Person person;

    @GetMapping("/person")
    public Person getPerson() {
        return person;
    }
}

运行结果如下

我们可以导入配置文件处理器,以后编写配置就有提示了

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

注意:使用@ConfigurationProperties注入属性时如果只给属性提供get方法,会报错

例

java 复制代码
/**
 * yml配置
 */
sms:
  region-id: cn-shanghai
  access-key-id: 123
  access-key-secret: 123
  sign-name: 叮咚买菜
  

/**
 * 实体类
 */
@Getter
@Component
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
    private String regionId;

    private String accessKeyId;

    private String accessKeySecret;
}


/*
报错
Description:

Failed to bind properties under 'sms' to com.example.producer.producerdemo.util.SmsProperties:

    Property: sms.access-key-id
    Value: 123
    Origin: class path resource [application.yml] - 51:18
    Reason: java.lang.IllegalStateException: No setter found for property: access-key-id

Action:

Update your application's configuration
*/

@Value和@ConfigurationProperties比较

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

配置文件yml还是properties他们都能获取到值;

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

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

相关推荐
lizhongxuan33 分钟前
Agent Sandbox: Firecracker 镜像、启动与 I/O
后端
三8441 小时前
Fastjson 漏洞 · 02 · autoType 机制与 checkAutoType
java·fastjson
打工仔折腾 AI1 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
无限码力2 小时前
小红书笔试真题 9.17 - 待发热度重排(C++/Py/Java /Js/Go)
java·小红书·小红书笔试真题·小红书技术岗笔试真题
卓怡学长2 小时前
w194基于ssm新能源汽车充电系统小程序
java·小程序·intellij-idea
小蒜学长2 小时前
基于Python的动物救助站管理系统的设计与实现(代码+数据库+LW)
数据库·后端·python·django·动物救助
JAVA面经实录9172 小时前
Java高级后端 · 全套面试通关手册(MySQL)
java·mysql·面试
小小张说故事2 小时前
Python 中 __new__ 和 __init__ 到底谁才是构造函数?一文讲透区别与 5 个坑
后端·python
光依旧2 小时前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp