【Spring】——14、如何使用@Value注解为bean的属性赋值呢?

news2024/11/25 2:22:50

在这里插入图片描述

📫作者简介:zhz小白
公众号:小白的Java进阶之路
专业技能:
1、Java基础,并精通多线程的开发,熟悉JVM原理
2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线上调优经验
3、熟悉MySQL数据库调优,索引原理等,⽇志原理等,并且有出过⼀篇专栏
4、了解计算机⽹络,对TCP协议,滑动窗⼝原理等有⼀定了解
5、熟悉Spring,Spring MVC,Mybatis,阅读过部分Spring源码
6、熟悉SpringCloud Alibaba体系,阅读过Nacos,Sentinel,Seata,Dubbo,Feign,Gateway核⼼源码与设计,⼆次开发能⼒
7、熟悉消息队列(Kafka,RocketMQ)的原理与设计
8、熟悉分库分表ShardingSphere,具有真实⽣产的数据迁移经验
9、熟悉分布式缓存中间件Redis,对其的核⼼数据结构,部署架构,⾼并发问题解决⽅案有⼀定的积累
10、熟悉常⽤设计模式,并运⽤于实践⼯作中
11、了解ElasticSearch,对其核⼼的原理有⼀定的了解
12、了解K8s,Jekins,GitLab
13、了解VUE,GO
14、⽬前有正在利⽤闲暇时间做互游游戏,开发、运维、运营、推销等

本人著作git项目:https://gitee.com/zhouzhz/star-jersey-platform,有兴趣的可以私聊博主一起编写,或者给颗star
领域:对支付(FMS,FUND,PAY),订单(OMS),出行行业等有相关的开发领域
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~

文章目录

  • 1、@Value注解能做什么呢?
  • 2、@Value的核心源码
  • 3、用法
    • 3.1、不通过配置文件注入属性的情况
    • 3.2、通过配置文件注入属性的情况
  • 4、扩展
    • 4.1、#{}和${}的区别
      • 4.1.1、${...}的用法
      • 4.1.2、#{}的用法
      • 4.1.3、${···}和#{···}的混合使用
      • 4.1.4、总结

1、@Value注解能做什么呢?

注入String类型和基本数据类型的属性值

2、@Value的核心源码

package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {

	String value();

}

由该注解的Target可知,@Value注解可用于属性,方法,参数,注解上,并且是程序运行时生效。

3、用法

3.1、不通过配置文件注入属性的情况

  • 普通字符串
@Value("1")
private int count;
  • 系统属性
@Value("#{systemProperties['os.name']}")
private String osName; // 注入操作系统属性
  • SpEL表达式
@Value("#{ T(java.lang.Math).random() * 10 }")
private double randomNumber; 
  • 注入其他Bean的属性的值
@Value("#{postPerson.name}")
private String username; // 注入其他bean中属性的值,即注入postPerson对象的name属性中的值
  • 注入文件
@Value("classpath:/jdbc.properties")
private Resource jdbcFile; 
  • 注入URL
@Value("http://www.sina.cn")
private Resource url; 

3.2、通过配置文件注入属性的情况

首先我们创建一个jdbc.properties文件,如下:
在这里插入图片描述

其内容如下:

url:jdbc:mysql://localhost:3306/test
username:root
password:root
driverClassName=com.mysql.jdbc.Driver

然后我们创建类去读取,并在该类上使用@PropertySource注解读取外部配置文件中的key/value并保存到运行的环境变量中。如下:
JdbcConfigProperties.class

package com.zhz.config;

import com.zhz.bean.Jdbc;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * @description: TODO
 * @motto: 代码源于生活,高于生活艺术
 * @author: zhouhengzhe
 * @date: 2022/12/8 10:32
 * @since 1.0
 **/
@PropertySource("classpath:jdbc.properties")
@Configuration
public class JdbcConfigProperties {

    @Bean
    public Jdbc jdbc(){
        return new Jdbc();
    }


}

加载完外部的配置文件以后,接着我们就可以使用${key}取出配置文件中key所对应的值,并将其注入到bean的属性中了。
Jdbc.class

package com.zhz.bean;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;

/**
 * @description: TODO
 * @motto: 代码源于生活,高于生活艺术
 * @author: zhouhengzhe
 * @date: 2022/12/8 10:35
 * @since 1.0
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Jdbc {
    @Value("${url}")
    private String url;

    @Value("${username}")
    private String username;

    @Value("${password}")
    private String password;

    @Value("${driverClassName}")
    private String driverClassName;
}

然后我们运行项目,可以看到已经注入进来
在这里插入图片描述

4、扩展

4.1、#{}和${}的区别

4.1.1、${…}的用法

{}里面的内容必须符合SpEL表达式,通过@Value(“${spelDefault.value}”)我们可以获取属性文件中对应的值,但是如果属性文件中没有这个属性,那么就会报错。不过,我们可以通过赋予默认值来解决这个问题,如下所示。

@Value("${url:www.baidu.com}")
private String url;

上述代码的含义是表示向bean的属性中注入属性文件中的url属性所对应的值,如果属性文件中没有url这个属性,那么便向bean的属性中注入默认值www.baidu.com。

4.1.2、#{}的用法

#{}里面的内容同样也是必须符合SpEL表达式。例如,

// SpEL:调用字符串Hello World的concat方法
@Value("#{'Hello Zhz'.concat('!')}")
private String zhzConcat;

// SpEL:调用字符串的getBytes方法,然后再调用其length属性
@Value("#{'Hello Zhz'.bytes.length}")
private String zhzLength;

4.1.3、${···}和#{···}的混合使用

// SpEL:传入一个字符串,根据","切分后插入列表中, #{}和${}配合使用时,注意不能反过来${}在外面,而#{}在里面
@Value("#{'${server.name}'.split(',')}")
private List<String> severs;
  • 注意:Spring的执行KaTeX parse error: Expected 'EOF', got '#' at position 7: {}的时机比#̲{}要早,所以先执行{},再执行#{}

4.1.4、总结

  • #{···}:用于执行SpEl表达式,并将内容赋值给属性
  • ${···}:主要用于加载外部属性文件中的值
  • KaTeX parse error: Expected 'EOF', got '#' at position 7: {···}和#̲{···}可以混合使用,但是必…{}在里面

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

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

相关文章

flask之g对象、flask-session使用、数据库连接池、信号

目录 g对象 flask-session的使用 数据库连接池 flask中集成mysql wtfroms使用(了解) 信号 g对象 全称global&#xff0c;是一个全局对象在此次请求过程中一直有效&#xff0c;其实就是请求的上下文从请求进来就一直存在直到请求结束&#xff0c;所以在当次请求过程中&…

华为云WeLink云空间,企业的多啦A梦「百宝袋」办公助手

我们知道&#xff0c;源自华为19万员工的数字化办公实践的华为云WeLink&#xff0c;作为新一代智能工作平台、远程办公平台、移动办公平台、协同办公软件&#xff0c;已经给成为企业数字化转型的连接器。今天&#xff0c;我们来聊一聊WeLink提供的一项优质服务——云空间。 We…

论文复现-2代码研读:Black-Box Tuning for Language-Model-as-a-Service

第一步&#xff1a;将作者所给代码跑通。 下载代码&#xff0c;放置在本地文件夹。 报错问题一&#xff1a; 使用hugging face 中loaddataset函数报错。显示connect error。 修改如下&#xff1a;将数据集下载文件.py文件在本地&#xff0c;然后从.py文件中加载数据集。 解决…

【深度学习】PyTorch深度学习实践 - Lecture_13_RNN_Classifier

文章目录一、问题描述二、OurModel三、准备数据3.1 Data Convert3.2 Padding Data3.3 Label Convert四、双向RNN五、PyTorch代码实现5.1 引入相关库5.2 创建Tensors函数5.3 将名字转化为字符列表函数5.4 国家名字数据集对象5.5 RNN&#xff08;GRU&#xff09;分类器对象5.6 训…

Nacos--多环境的实现方案

原文网址&#xff1a;Nacos--多环境的实现方案_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Nacos实现多环境的方案。 方案概述 多环境有很多方案&#xff0c;如下&#xff1a; 单租户方案&#xff08;适用于项目很少的场景&#xff09; 命名空间区分环境&#xff0c;GR…

Python简介

Python简介 目录1. 概述2. 安装3. 编译器4. 注释5. 缩进6. 编码规范7. 基本输入输出使用print()函数输出使用input()函数输入8. 练习1. 概述 Python的中文意思是蟒蛇&#xff0c;python是一种面向对象的解释型的计算机程序设计语言。支持面向过程&#xff0c;面向对象&#xff…

(十四)Vue之收集表单数据

文章目录v-model的三个修饰符收集文本框收集单选按钮收集复选框收集下拉列表收集文本域演示程序Vue学习目录 上一篇&#xff1a;&#xff08;十三&#xff09;Vue之监测数据改变的原理 v-model的三个修饰符 v-model的三个修饰符&#xff1a; lazy&#xff1a;失去焦点再收集…

MIT6.830-2022-lab2实验思路详细讲解

目录一、Exercise1.1、Exercise1&#xff1a; Filter and Join1.2、Exercise2&#xff1a; Aggregates1.3、Exercise 3&#xff1a;HeapFile Mutability1.4、Exercise 4&#xff1a;Insertion and deletion1.5、Exercise 5&#xff1a; Page eviction二、总结一、Exercise 1.1…

人工智能课后作业_python实现A*算法实现8数码问题(附源码)

3 A*算法实现8数码问题 3.1算法介绍3.2实验代码3.3实验结果3.4实验总结 3.1算法介绍 Astar算法是一种求解最短路径最有效的直接搜索方法&#xff0c;也是许多其他问题的常用启发式算法。它的启发函数为f(n)g(n)h(n),其中&#xff0c;f(n) 是从初始状态经由状态n到目标状态的…

竞拍拍卖管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系我门、公告信息、拍卖物品&#xff0c;拍卖完成 管理员功影&#xff1a; 1、管理关…

信贷反欺诈体系介绍及其策略规则应用

在信贷业务的风控体系中&#xff0c;反欺诈始终是一个重要话题&#xff0c;与信用评估构成的贷前风控两大模块&#xff0c;对于贷前风险的防范控制发挥着决定性作用。反欺诈虽然在理解层面上感觉略显简单&#xff0c;但由于场景的复杂性与丰富度&#xff0c;使得反欺诈在研究开…

PD QC快充诱骗取电方案:输出9V12V15V20V

手机快充充电器或充电宝&#xff0c;在没有与手机通讯时&#xff0c;快充充电器相当于普通的充电器只输出5V电压&#xff0c;要想得到充电器的9V/12V等电压&#xff0c;可以使用快充取电电路。 或者也可以使用电子元件来搭建诱骗电路&#xff0c;但是和专用的取电芯片方案相比&…

Part 1:RPA的发展历程

Robot一词的来源 捷克科幻小说家卡雷尔恰佩克创作&#xff0c;于1921 年在布拉格首映的《罗素姆万能机器人》作品中首次出现“robot”&#xff08;机器人&#xff09;一词。这个词源于捷克语的“robota”&#xff0c;意思是“苦力”。恰佩克的机器人原本是为它们的人类主人服务…

Python使用Selenium Webdriver爬取网页所有内容

Python使用Selenium Webdriver爬取网页所有内容一、为什么我抓不到网页的全部html内容二、Selenium的基本使用三、使用Selenium抓取全部HTML一、为什么我抓不到网页的全部html内容 有时候&#xff0c;我们在用urllib或者requests库抓取页面时&#xff0c;得到的html源代码和浏…

4年测试在岗,薪资却被春招来的年轻人超过了,其实你一直在假装努力~

最近和一位同行朋友聊天&#xff0c;一开始大家也没有谈工作&#xff0c;毕竟是出来聚聚&#xff0c;放松一下&#xff0c;吃饭的时候&#xff0c;喝了点小酒&#xff0c;酒过三巡&#xff0c;这个朋友开始诉苦水&#xff0c;大概意思嘞&#xff0c;我给大家概况一下&#xff0…

STM32F4的关键要点分析

1. 从以上截图信息可以看出&#xff1a; 1.当外设数据宽度和内存数据宽度不相等时&#xff0c;要传输的数据项数目的数据宽度由外设数据宽度确定&#xff1b; 2.在直接模式下&#xff08;不使用FIFO&#xff09;&#xff0c;不能进行数据的封装/解封&#xff0c;且源数据宽度和…

Docker-Docker安装nginx

目录 一&#xff0c;容器之间的相互通信 ping 1.1 两个容器在同一网段 1.2 两个容器在不同网段 二&#xff0c;安装Nginx 2.1 nginx是什么 安装步骤 2.4 部署前端项目 上传项目 步骤 一&#xff0c;容器之间的相互通信 ping 1.1 两个容器在同一网段 1.2 两个容器在不同网段…

旋转机械 | 基于ANSYS WB平台的滑动轴承分析工具(一)

导读&#xff1a;本文主要针对Tribo-X inside ANSYS的功能及各方向应用实例进行介绍&#xff0c;限于篇幅关系会分五篇进行介绍&#xff0c;第一篇主要结合软件的需求、理论、功能及应用方向进行介绍&#xff0c;第二篇至第五篇将结合具体应用方向的示例进行介绍。本篇为第一篇…

软件测试工程师的简历项目经验该怎么写?

想要找一份高薪的软件测试工作&#xff0c;简历项目必不可少&#xff08;即使是应届生&#xff0c;你也要写上实习项目&#xff09;。所以很多自学的朋友找工作时会碰到一个令人颇感绝望的拦路虎&#xff1a;个人并没有实际的项目工作经验怎么办&#xff1f; 怎么办&#xff1…

【PS】画笔工具

目录 画直线 拾取颜色 改变画笔大小 改变画笔硬度 不透明度 流量 画笔预设 自定义图片做笔刷 工具预设 画笔面板 画直线 Shift键可画出直线只用点两个点就画出直线&#xff1a;先点一个点&#xff0c;按住shift&#xff0c;再在别处点一点&#xff0c;这时候直线就形…