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

在这里插入图片描述

📫作者简介: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注解能做什么呢?

注入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: {···}和#̲{···}可以混合使用,但是必…{}在里面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhz小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值