如何使用@Value注解为bean的属性赋值呢

简介: 如何使用@Value注解为bean的属性赋值呢

@[toc]

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();

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
由该注解的Target可知,@Value注解可用于属性,方法,参数,注解上,并且是程序运行时生效。

3、用法

3.1、不通过配置文件注入属性的情况
普通字符串
@Value("1")
private int count;
1
2
系统属性
@Value("#{systemProperties['os.name']}")
private String osName; // 注入操作系统属性
1
2
SpEL表达式
@Value("#{ T(java.lang.Math).random() * 10 }")
private double randomNumber;
1
2
注入其他Bean的属性的值
@Value("#{postPerson.name}")
private String username; // 注入其他bean中属性的值,即注入postPerson对象的name属性中的值
1
2
注入文件
@Value("classpath:/jdbc.properties")
private Resource jdbcFile;
1
2
注入URL
@Value("http://www.sina.cn")
private Resource url;
1
2
3.2、通过配置文件注入属性的情况
首先我们创建一个jdbc.properties文件,如下:

其内容如下:

url:jdbc:mysql://localhost:3306/test
username:root
password:root
driverClassName=com.mysql.jdbc.Driver
1
2
3
4
然后我们创建类去读取,并在该类上使用@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();
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
加载完外部的配置文件以后,接着我们就可以使用${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;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
然后我们运行项目,可以看到已经注入进来

4、扩展

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

@Value("${url:www.baidu.com}")
private String url;
1
2
上述代码的含义是表示向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;
1
2
3
4
5
6
7
4.1.3、${···}和#{···}的混合使用
// SpEL:传入一个字符串,根据","切分后插入列表中, #{}和${}配合使用时,注意不能反过来${}在外面,而#{}在里面
@Value("#{'${server.name}'.split(',')}")
private List severs;
1
2
3
注意:Spring的执行KaTeX parse error: Expected 'EOF', got '#' at position 7: {}的时机比#̲{}要早,所以先执行{},再执行#{}
4.1.4、总结

  • {···}:用于执行SpEl表达式,并将内容赋值给属性

  • ${···}:主要用于加载外部属性文件中的值
  • {···}和#{···}可以混合使用,但是必…{}在里面
相关文章
|
存储
【数据结构】----顺序表项目-通讯录
【数据结构】----顺序表项目-通讯录
102 0
|
6天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
16天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
10天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
625 217
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
861 61
|
8天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1341 157
|
5天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
249 138
|
7天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
551 109