Spring中的@Value注解

news2024/11/29 12:00:18

文章目录

    • **概述**
    • **使用方式**
    • 基于配置文件的注入
    • 基于非配置文件的注入
    • 注入普通字符串
    • 注入操作系统属性
    • 注入表达式结果
    • 注入其他bean属性
    • 注入URL资源

概述

本文配置文件为yml文件

在使用spring框架的项目中,@Value是经常使用的注解之一。其功能是将与配置文件中的键对应的值分配给其带注解的属性。在日常使用中,我们常用的功能相对简单。本文使您系统地了解@Value的用法。

@Value 注解可以用来将外部的值动态注入到 Bean 中,在 @Value 注解中,可以使${} 与 #{} ,它们的区别如下:

(1)@Value(“${}”):可以获取对应属性文件中定义的属性值。

(2)@Value(“#{}”):表示 SpEl 表达式通常用来获取 bean 的属性,或者调用 bean 的某个方法。

使用方式

根据注入的内容来源,@ Value属性注入功能可以分为两种:通过配置文件进行属性注入和通过非配置文件进行属性注入。
非配置文件注入的类型如下:

1.注入普通字符串
2.注入操作系统属性
3.注入表达式结果
4.注入其他bean属性
5.注入URL资源

基于配置文件的注入

首先,让我们看一下配置文件中的数据注入,无论它是默认加载的application.yml还是自定义my.yml文档(需要@PropertySource额外加载)。

application.yml文件配置,获得里面配置的端口号
在这里插入图片描述
程序源代码

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    /**
     *Get in application.yml
     */
    @Value("${server.port}")
    private String port;


    @Test
    public  void  getPort(){

       System.out.println(port);
    }

}

程序结果
在这里插入图片描述

自定义yml文件,application-config.yml文件配置,获得里面配置的用户密码值

注意,如果想导入自定义的yml配置文件,应该首先把自定义文件在application.yml文件中进行注册,自定义的yml文件要以application开头,形式为application-fileName
在这里插入图片描述

配置信息
在这里插入图片描述

测试程序

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    /**
     *Get in application-config.yml
     */
    @Value("${user.password}")
    private String password;

    @Test
    public  void  getPassword(){

       System.out.println(password);
    }

}

程序结果
在这里插入图片描述

基于配置文件一次注入多个值

配置信息
在这里插入图片描述

测试程序

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    /**
     *Injection array (automatically split according to ",")
     */
    @Value("${tools}")
    private String[] toolArray;

    /**
     *Injection list form (automatic segmentation based on "," and)
     */
    @Value("${tools}")
    private List<String> toolList;

    @Test
    public  void  getTools(){

       System.out.println(toolArray);
       System.out.println(toolList);
    }

}

程序结果

在这里插入图片描述

基于非配置文件的注入

在使用示例说明基于非配置文件注入属性的实例之前,让我们看一下SpEl。

Spring Expression Language是Spring表达式语言,可以在运行时查询和操作数据。使用#{…}作为操作符号,大括号中的所有字符均视为SpEl。

让我们看一下特定实例场景的应用:

注入普通字符串

测试程序

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    // 直接将字符串赋值给 str 属性
    @Value("hello world")
    private String str;


    @Test
    public  void  getValue(){

        System.out.println(str);
    }

}

程序结果
在这里插入图片描述

注入操作系统属性

可以利用 @Value 注入操作系统属性。

测试程序

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    @Value("#{systemProperties['os.name']}")
    private String osName; // 结果:Windows 10

    @Test
    public  void  getValue(){

        System.out.println(osName);
    }
}

程序结果
在这里插入图片描述

注入表达式结果

在 @Value 中,允许我们使用表达式,然后自动计算表达式的结果。将结果复制给指定的变量。如下

测试程序

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    // 生成一个随机数
    @Value("#{ T(java.lang.Math).random() * 1000.0 }")
    private double randomNumber;

    @Test
    public  void  getValue(){

        System.out.println(randomNumber);
    }
}

程序结果
在这里插入图片描述

注入其他bean属性

其他Bean

package cn.wideth.controller;

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

//其他bean,自定义名称为 myBeans
@Component("myBeans")
public class OtherBean {

    @Value("OtherBean的NAME属性")
    private String name;

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

测试程序

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    @Value("#{myBeans.name}")
    private String fromAnotherBean;

    @Test
    public  void  getValue(){

        System.out.println(fromAnotherBean);
    }
}

程序结果
在这里插入图片描述

注入URL资源

测试程序

package cn.wideth.controller;

import cn.wideth.PdaAndIpadApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import java.net.URL;

@RunWith(SpringRunner.class)
@SpringBootTest()
@ContextConfiguration(classes = PdaAndIpadApplication.class)
public class ValueController {

    /**
     *注入 URL 资源
     */
    @Value("https://www.baidu.com/")
    private URL homePage;

    @Test
    public  void  getValue(){

        System.out.println(homePage);
    }
}

程序结果
在这里插入图片描述

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

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

相关文章

MANA OASIS加持,毫末算力极致优化,训练成本降低100倍

2023年1月5日&#xff0c;第七届HAOMO AI DAY在北京举办。正值岁末年初&#xff0c;中国自动驾驶届开年盛会精彩来袭。本届AI DAY上&#xff0c;毫末分享了2022年三大战役稳健收官成果&#xff0c;展望2023年全球自动驾驶发展趋势&#xff0c;并发布毫末技术、产品最新成果。 &…

基于java ssm springboot选课推荐交流平台系统设计和实现

基于java ssm springboot选课推荐交流平台系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基于java ss…

docker 看懂这一篇文章就够了

docker就像是手机的应用商店&#xff0c;有了应用商店&#xff0c;就不用自己一个app一个app(微服务开发所需要的中间件)去百度搜索下载&#xff0c;可以在应用商店里面一键下载&#xff08;使用简单的docker命令即可&#xff09; 总之就是一句话&#xff0c;docker pull 镜像…

ubuntu20.04安装4090驱动

实验室配置了一台新主机&#xff0c;现在安装好了20.04&#xff0c;为了安装4090的驱动查找了很多资料。接下来记录一下安装4090驱动的过程&#xff0c;为方便未来安装其他的显卡驱动。 首先推荐一个视频&#xff0c;在为查找了很多资料后&#xff0c;发现这个视频讲的实在是太…

【SQL】无列名查询表中数据

目录 【SQL】无列名查询表中数据 拓展 如果mysql中 information_schema 使用不了&#xff0c;怎么查询所有的数据库名&#xff0c;表名&#xff1f; 【SQL】无列名查询表中数据 有些时候&#xff0c;我们可能获取不了mysql数据库&#xff0c;表中的字段名称&#xff0c;那么…

基于Java+SpringBoot+vue+element实现扶贫助农政策平台系统

基于JavaSpringBootvueelement实现扶贫助农政策平台系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写> 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术…

0基础快速入门Python数据挖掘

推荐教程&#xff1a;4天快速入门Python数据挖掘 课程简介 该阶段主要是介绍一些数据科学领域用Python语言实现的基础库&#xff0c;如简洁、轻便的数据可视化展示工具Matplotlib&#xff0c;高效的运算工具Numpy&#xff0c;方便的数据处理工具Pandas&#xff0c;为人工智能阶…

疑难杂症之anaconda虚拟环境安装还有anaconda无数次的卸载重装

教训&#xff1a;使用虚拟环境无数次重装& 卸载彻底删除命令&#xff1a;打开cmd --> 输入一下命令conda install anaconda -cleananaconda -clean --yes生成的备份文件夹可以删除**手动删除anaconda环境路径下的envs 和pkgs文件**然后从卸载界面点击正常卸载anaconda即…

Anaconda下载库(安装包)、创建虚拟环境等

conda install pak # 安装包&#xff0c;pak代表包名&#xff0c;可依次安装多个包或指定版本&#xff0c;包名之间空格分开&#xff1b; conda remove pak # 移除指定包 conda update pak # 更新包 conda upgrade --all # 更新所以包 conda search pak # …

【数组】leetcode59.螺旋矩阵II(C/C++/Java/Js)

leetcode59.螺旋矩阵II1 题目2 思路3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 JavaScript版本4 总结&#xff1a;1 题目 题源链接 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1…

shell脚本之sed练习题

把/etc/passwd 复制到/root/test.txt&#xff0c;用sed打印所有行 #使用cp命令将/etc/passwd的内容复制到/root/test.txt中 [rootWilliam ~]# cp /etc/passwd /root/test.txt#采用sed命令将其打印出来 [rootWilliam ~]# sed -n p test.txt打印test.txt的3到10行 [rootWilliam…

都2023年了,还不知道怎么学习网络安全?来看看吧,很难找全的

前言 最近收到不少关注朋友的私信和留言&#xff0c;大多数都是零基础小友入门网络安全&#xff0c;需要相关资源学习。其实看过的铁粉都知道&#xff0c;之前的文里是有过推荐过的。新来的小友可能不太清楚&#xff0c;这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

逆向-还原代码之little-or-big (Interl 64)

// 源代码 #include <stdio.h> /* * 2016/9/29 yu liang. */ int test_one(void) { int i1; char *p(char *)&i; if(*p1) printf("Little_endian\n"); // Little_endian else printf("B…

cmake报错:Unsupported protocol

现象 最近在用cmake编译Apache arrow时&#xff0c;竟然报了错&#xff1a; 排查过程 最开始在网上直接搜“Unsupported protocol”&#xff0c;查到的说是因为安装的curl不支持https&#xff0c;需要先使用如下命令查询curl支持的协议&#xff1a; curl -V然而查出来却是…

微服务面试必问的Dubbo,这么详细还怕自己找不到工作?

前言 互联网的不断发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对。 服务化的进一步发展&#xff0c;服务越来越多&#xff0c;服务之间的调用和依赖关系也越来越复杂&#xff0c;诞生了面向服务的架构体系(SOA)&#xff0c; 也因此衍生出…

财富自由、技术瓶颈、面试技巧,找另一半...这些程序员最关心的问题,AI的回答神了!

距离ChatGPT发布已经好几周了&#xff0c;我还沉迷在和它的聊天当中&#xff0c;每天一遇到问题&#xff0c;我的第一反应就是先问问ChatGPT的建议&#xff0c;作为一名程序员&#xff0c;我们可能有很多问题或困惑&#xff0c;我也问问了它&#xff0c;整理了一些比较有代表性…

Nodejs三层架构的封装

nodejs三层架构开发模式 项目结构 依次在每个目录添加代码 1.在dao层下创建database.js模块,里面存放的是连接数据库的模块代码 const {connect,connection} require(mongoose); // 设置要连接的 MongoDB 服务器地址(studentsManage:要连接的数据库名称) const dbURI mong…

Unity InputSystem基础

一些概念 Action Maps 一组Action的集合为一个Action Map。可以同时有多个Action Map&#xff0c;可以进行切换&#xff0c;也可以同时运行&#xff08;监控&#xff09;。例如可以使用joystick控制角色移动&#xff0c;也可以使用joystick控制菜单。通过切换Action Map&#x…

别小看 Log 日志,它难住了我们组的架构师

Slf4j slf4j 的全称是 Simple Loging Facade For Java&#xff0c;它仅仅是一个为 Java 程序提供日志输出的统一接口&#xff0c;并不是一个具体的日志实现方案&#xff0c;就比如 JDBC 一样&#xff0c;只是一种规则而已。所以单独的 slf4j 是不能工作的&#xff0c;必须搭配…

Go后端部署服务器

go后端部署服务器方式一&#xff1a;&#xff08;最简单&#xff09; 和暑假做重点场所项目部署一样&#xff0c;简单&#xff0c;无脑&#xff0c;手动&#xff0c;麻烦 1、# 修改&#xff08;确保&#xff09;环境&#xff0c;因为服务器是linux系统 go env -w GOOSlinux …