@Value获取值和@ConfigurationProperties获取值用法及比较(springboot)

news2024/9/24 19:18:22

目录

  • 1. 简介
    • 1.1 @value
      • 基本用法
    • 1.2 @ConfigurationProperties
      • 基本用法
  • 2. 使用
    • 2.1 @value的使用
      • 创建application.yml
      • 创建Person.java
      • 创建Dog类
      • 写一个测试类
    • 2.2 @ConfigurationProperties的用法
      • 创建Person2.java
      • Dog类
      • 写测试类
  • 3. 区别
    • 3.1 松散绑定
      • 例子
    • 3.2 SpEL
      • 主要用途
      • 特点
      • 例子
    • 3.3 JSP303数据校验
    • 3.4 复杂类型封装
  • 4. 参考链接

1. 简介

1.1 @value

在Spring Boot中,@Value注解是一个非常有用的特性,它允许我们将外部的配置(如application.properties或application.yml文件中的属性)注入到我们的Bean中。这对于读取配置信息,如数据库连接信息、服务地址等,非常有用。

基本用法

@Value注解可以应用于字段、setter方法或配置方法上。它使用SpEL(Spring Expression Language)表达式来读取配置值。

1.2 @ConfigurationProperties

@ConfigurationProperties 是 Spring Boot 提供的一个非常强大的注解,用于将配置文件中的属性绑定到 Java Bean 上。与 @Value 注解相比,@ConfigurationProperties 提供了更丰富的特性,比如松散绑定(relaxed binding)、JSR-303 数据校验以及复杂的类型绑定等。

基本用法

  1. 定义一个配置类:首先,你需要定义一个配置类,并使用 @ConfigurationProperties 注解来指定配置的前缀。
  2. 启用配置属性绑定:默认情况下,Spring Boot 会自动扫描带有 @ConfigurationProperties 注解的类,并将它们注册为 Spring 应用上下文中的 bean。但是,如果你想要精确地控制哪些配置类被注册,你可以在 @EnableConfigurationProperties 注解中指定它们。
  3. 在配置文件中设置属性:在 application.properties 或 application.yml 文件中设置与配置类属性相对应的配置项。

2. 使用

2.1 @value的使用

首先创建springboot的项目

创建application.yml

person:
  name : 岳轩子
  sex :age : 18
  birthday : 2002/2/31
  maps : { k1 : 20 , k2 : 21}
  lists : [小黄 , 小黑]
  dog:
    name : 旺财

创建Person.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@Validated
public class Person {
    @Value("${person.name}")
    private String name;
    @Value("${person.sex}")
    private Character sex;
    @Value("${person.age}")
    private Integer age;
    @Value("${person.birthday}")
    private Date birthday;
    private Map<String, Integer> maps;
    private List<String> lists;
    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Character getSex() {
        return sex;
    }

    public void setSex(Character sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Map<String, Integer> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Integer> maps) {
        this.maps = maps;
    }

    public List<String> getLists() {
        return lists;
    }

    public void setLists(List<String> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                ", birthday=" + birthday +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

创建Dog类

package com.example.springbootdaily.model;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Component
@Validated
public class Dog {
    @Value("${person.dog.name}")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}

写一个测试类

import com.example.springbootdaily.model.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringTest {
    @Autowired
    Person person;

    @Test
    public void print(){
        System.out.println(person);
    }
}

运行结果:

Person{name='岳轩子', sex=雄, age=18, birthday=Sun Mar 03 00:00:00 CST 2002, maps=null, lists=null, dog=null}

2.2 @ConfigurationProperties的用法

创建Person2.java

package com.example.springbootdaily.model;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person2 {
    private String name;
    private Character sex;
    private Integer age;
    private Date birthday;
    private Map<String, Integer> maps;
    private List<String> lists;
    private Dog dog;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Character getSex() {
        return sex;
    }

    public void setSex(Character sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Map<String, Integer> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Integer> maps) {
        this.maps = maps;
    }

    public List<String> getLists() {
        return lists;
    }

    public void setLists(List<String> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                ", birthday=" + birthday +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

Dog类

package com.example.springbootdaily.model;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Component
@Validated
public class Dog {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}

写测试类

 @Test
 public void print3(){
     System.out.println(person2);
 }

运行结果:

Person{name='岳轩子', sex=, age=18, birthday=Sun Mar 03 00:00:00 CST 2002, maps={k1=20, k2=21}, lists=[小黄, 小黑], dog=Dog{name='旺财'}}

3. 区别

在这里插入图片描述

3.1 松散绑定

@ConfigurationProperties 的松散绑定(relaxed binding)是 Spring Boot 提供的一个特性,它允许你在配置文件中使用不同的命名风格(如驼峰命名、短横线分隔等),而 Spring Boot 能够自动地将其映射到 Java Bean 的属性上。这种特性使得配置文件的编写更加灵活,同时也使得 Java Bean 的属性命名更加符合 Java 的命名习惯。

松散绑定的工作原理:
当你使用 @ConfigurationProperties 注解来绑定配置文件中的属性时,Spring Boot 会尝试根据以下规则来匹配属性名:

  1. 驼峰命名与短横线分隔的互转:如果你的 Java Bean 属性使用驼峰命名(如 myProperty),那么你可以在配置文件中使用短横线分隔的形式(如 my-property)来设置这个属性的值。Spring Boot 会自动地将这两种命名风格进行转换。
  2. 忽略大小写:在松散绑定中,大小写通常会被忽略,但请注意,这取决于你使用的配置文件格式(如 YAML 是大小写敏感的,而 properties 文件则不是)。然而,即使对于大小写敏感的文件格式,Spring Boot 也会尝试以智能的方式匹配属性名。
  3. 环境变量:对于环境变量,松散绑定的规则也适用。通常,环境变量名使用大写字母和下划线(如 MY_PROPERTY),而 Java Bean 属性则使用驼峰命名。Spring Boot 能够处理这种差异。

例子

application.yml
这里的name中间加了一个线

person:
  na-me : 岳轩子
  sex :age : 18
  birthday : 2002/2/31
  maps : { k1 : 20 , k2 : 21}
  lists : [小黄 , 小黑]
  dog:
    name : 旺财

仍然可以获取
运行结果:

Person{name='岳轩子', 

3.2 SpEL

SpEL(Spring Expression Language)是 Spring 框架中的一个功能强大的表达式语言,它支持在运行时查询和操作对象图。SpEL 是一种类似于 JSP EL(JavaServer Pages Expression Language)但功能更强大的表达式语言,它用于在运行时查询和操作数据。

主要用途

Bean 属性的动态访问:在 Spring 配置文件中,你可以使用 SpEL 来动态地访问和设置 Bean 的属性。
注解中的属性值:在 Spring 的注解中,你也可以使用 SpEL 来设置注解的属性值。
XML 配置中的属性值:在 Spring 的 XML 配置文件中,可以通过 标签的 value 或 ref 属性结合 SpEL 来设置属性值。
@Value 注解:在 Java 代码中,可以使用 @Value 注解结合 SpEL 来注入配置值或计算结果。

特点

功能强大:支持基本运算、关系运算、逻辑运算、正则表达式匹配、集合操作等。
易于使用:语法简洁,易于学习和使用。
集成性好:与 Spring 框架紧密结合,可以在 Spring 的各种场景中使用。

例子

在这里插入图片描述
运行结果

XXX

3.3 JSP303数据校验

先导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

这里是@Value,不支持

@Email
@Value("${person.name}")
private String name;

如果不是email的话,会报错
在这里插入图片描述

3.4 复杂类型封装

前面已经使用了,@Value不能封装map,list和对象类型
但是@ConfigurationProperties可以

4. 参考链接

@Value的用法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

240803-沉侵式翻译插件配置Ollama的API实现网页及PDF文档的翻译

1. 在插件中点击Options按钮 2. 在开发者模式中启动Enable Beta Testing Features 3 在General中进行设置 ## 4. 在Expand中设置API的URL 5. Qwen&#xff1a;0.5B网页翻译效果 6. Qwen&#xff1a;0.5BPDF翻译效果 7. 参考文献 gemma - 给沉浸式翻译插件配置本地大模型o…

剪画小程序:致敬奥运举重冠军:照片变成动漫风格!

在巴黎奥运会的赛场上&#xff0c;那些奥运冠军们的身影如同璀璨星辰&#xff0c;闪耀着无尽的光芒&#xff01; 看&#xff0c;举重冠军力拔山兮气盖世&#xff0c;那坚定的眼神中透露出无畏的勇气&#xff0c;爆发的力量更是震撼人心。 借助剪画&#xff0c;将这令人心潮澎湃…

【Vue】computed计算对象不生效问题?

问题描述 最近使用vuex来管理全局状态&#xff0c;遇到了computed计算state中数据却不生效的问题。 原因分析&#xff1a; 先看vue官网示例&#xff1a; computed接收的是一个getter函数&#xff0c;但是这个getter函数是懒加载并且有缓存的&#xff0c;当计算属性最终计算…

ORACLE和PG的饭圈文化

饭圈文化: 就是FANS! 饭圈&#xff0c;网络用语中指粉丝圈子的简称&#xff0c;另外“粉丝”一词的英文单词为“fans”&#xff0c;单词fans本身由fans构成&#xff0c;s一般表示多个&#xff0c;其中的fan可以直接音译为“饭”。 [1]粉丝群体叫“饭”&#xff0c;他们组成的…

特定领域软件架构-系统架构师(三十八)

软件架构复用 有三个阶段&#xff1a; 首先构造/获取可复用的软件资产其次管理这些资产&#xff08;构件库&#xff09;最后针对这些需求&#xff0c;从这些资产中选择可复用的部分&#xff0c;满足需求应用系统。 特定领域软件架构 DSSA&#xff08;Domain Specific softwa…

小程序背景图片无法通过 WXSS 获取

问题&#xff1a;pages/index/index.wxss 中的本地资源图片无法通过 WXSS 获取 可以使用网络图片&#xff0c;或者 base64&#xff0c;或者使用标签。 将图片转换为base64&#xff0c;地址 base64图片在线转换工具 - 站长工具 在这里把要使用的图片转换一把&#xff0c;然后将得…

xss漏洞(三,xss进阶利用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 1&#xff0c;本文基于dvwa靶场以及PHP study进行操作&#xff0c;靶场具体搭建参考上一篇&#xff1a; xss漏洞&#xff08;二&#xff0c;xss靶场搭建以及简单…

点可云ERP进销存V8版本—销货订单的操作使用与关联单据处理

本章将要讲解销货订单的详细操作内容&#xff0c;以及导入导出、打印功能&#xff0c;还包括与销货订单相关联的其他单据之间的处理关系。 销货订单是指客户向用户企业提交的购买产品或者服务的请求或者指示&#xff0c;它记录了客户的需求和购买意向&#xff0c;并用于指导和管…

锅总浅析防火墙

防火墙简介 防火墙是一种网络安全设备或软件&#xff0c;用于监控和控制进出网络流量&#xff0c;基于一组预定义的安全规则来决定允许或阻止特定的网络流量。防火墙的主要目的是保护网络和计算机系统免受未经授权的访问、攻击和其他安全威胁。以下是防火墙的几个关键概念和类…

技术前沿:7个未来派网站模板的创新探索

1、即时设计资源广场 即时设计——可实时协作的专业 UI 设计工具https://ad.js.design/online/ui/?sourcecsdn&plan802即时设计是一种原型设计软件&#xff0c;其材料广场非常丰富&#xff0c;涵盖了组件、页面、原型、设计、思维导图、流程图、操作图等方面。因为即时设…

ASPCMS 漏洞详细教程

一.后台修改配置文件拿shell 登录后台 如下操作 保存并抓包 将slideTextStatus的值修改为1%25><%25Eval(Request(chr(65)))25><%25 放包&#xff08;连接密码是a&#xff09; 然后用工具连接 成功连接

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——3bin模型转化环境的准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——3bin模型转化环境的准备 ​ 今天给大家带来的是在上一期基础上最重要的一步&#xff0c;这个地方是我开始踩坑的开始。 ​ 当时一开始看教程&#xff0c;不知道怎么看到了高级进阶版。当时也是弄了好久…

声临其境!体验阿里云开源音频基座大模型——FunAudioLLM

千等万等&#xff0c;终于还是等来了阿里最新开源的音频基座大模型FunAudioLLM&#xff0c;真不愧是AI届的活菩萨啊&#xff0c;不过&#xff0c;我心心念念的达摩院寻光AI视频创作平台到底什么时候开放啊&#xff01;&#xff01; 停止发疯&#xff0c;进入正题。。。 引言 …

【C语言】关系、条件、逻辑操作符

1. 关系操作符 在C语言中用于比较的表达式称为关系表达式&#xff0c;而其中使用的运算符就称为关系运算符&#xff0c;主要有&#xff1a; >大于运算符<小于运算符>大于等于运算符<小于等于运算符相等运算符!不相等运算符 比如&#xff1a; a < b; a > …

安卓将子模块打aar包,并将其远程依赖打包进去

生成 AAR 包 在Android Studio Terminal 窗口输入以下命令&#xff1a; ./gradlew :monitor:assembleRelease把 monitor 换成你子模块的名称&#xff0c;不出意外的话 就会在下面目录生成相应aar文件 注意&#xff1a;如果你的Java运行环境是Java 8 则在老一点的AS上 可以运…

【Stable Diffusion】(基础篇九)—— 扩展

扩展 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 添加一些SD对应的扩展&am…

【前端 22】使用Nginx部署前端项目

使用Nginx部署前端项目 在前端开发中&#xff0c;将项目打包并部署到服务器上是一个常见的需求。Nginx以其高性能、稳定性和丰富的特性成为了前端项目部署的热门选择。下面&#xff0c;我将详细介绍如何使用Nginx部署一个前端项目&#xff0c;并展开讲解Nginx的目录结构以及如何…

第TR4周:Transformer中的位置编码详解

在实施 NLP 解决方案时&#xff0c;循环神经网络&#xff08;RNN&#xff09;具有处理序列顺序的内置机制。Transformer则是引入来位置编码机制来保存文本中字符的位置信息。 位置编码定义 位置编码记录了文本中字符的位置信息&#xff0c;这里位置信息的记录不使用单个数字&am…

quartz实现动态定时任务管理

1、需求 配置中&#xff0c;固定周期&#xff0c;单位秒。需要任务每间隔这个秒数 执行进行统计。 2、分析 要实现这个需求&#xff0c;之前一直在用的多线程方案也行。详见 既然前面用quartz 根据cron表达式上一次和下一次的执行时间判断。 本次就用quartz来实现动态任务。…

学生管理系统之数据库设计与开发

学生管理系统之数据库设计与开发 使用SQL创建表格 QT上写逻辑 创建一个类 <