spring成神之路第二十五篇:@Value【用法、数据来源、动态刷新】

本文介绍了Spring中@Value注解的使用,包括配置文件的引入、字段注入以及数据来源的扩展。文章通过面试场景引出@Value的动态刷新,详细阐述了如何通过自定义Scope实现配置的实时更新,提供了详细的代码示例和步骤解析,帮助读者掌握@Value的全面用法。
摘要由CSDN通过智能技术生成

面试官:Spring中的@Value用过么,介绍一下

我:@Value可以标注在字段上面,可以将外部配置文件中的数据,比如可以将数据库的一些配置信息放在配置文件中,然后通过@Value的方式将其注入到bean的一些字段中

面试官:那就是说@Value的数据来源于配置文件了?

我:嗯,我们项目最常用更多就是通过@Value来引用Properties文件中的配置

面试官:@Value数据来源还有其他方式么?

我:此时我异常开心,刚好问的我都研究过,我说:当然有,可以将配置信息放在db或者其他存储介质中,容器启动的时候,可以将这些信息加载到Environment中,@Value中应用的值最终是通过Environment来解析的,所以只需要扩展一下Environment就可以实现了。

面试官:不错嘛,看来你对spring研究的还是可以,是不是喜欢研究spring源码?

我:笑着说,嗯,平时有空的时候确实喜欢捣鼓捣鼓源码,感觉自己对spring了解的还可以,不能算精通,也算是半精通吧

面试官:看着我笑了笑,那@Value的注入的值可以动态刷新么?

我:应该可以吧,我记得springboot中有个@RefreshScope注解就可以实现你说的这个功能

面试官:那你可以说一下@RefreshScope是如何实现的么,可以大概介绍一下?

我:嗯。。。这个之前看过一点,不过没有看懂

面试官:没关系,你可以回去了再研究一下;你期望工资多少?

我:3万吧

面试官:今天的面试还算是可以的,不过如果@RefreshScope能回答上来就更好了,这块是个加分项,不过也确实有点难度,2.5万如何?

我:(心中默默想了想:2.5万,就是一个问题没有回答好,砍了5000,有点狠啊,我要回去再研究研究,3万肯定是没问题的),我说:最低2.9万

面试官:那谢谢你,今天面试就到这里,出门右拐,不送!

我有个好习惯,每次面试回去之后,都会进行复盘,把没有搞定的问题一定要想办法搞定,这样才不虚。

这次面试问题如下

  1. @Value的用法

  2. @Value数据来源

  3. @Value动态刷新的问题

@Value的用法

系统中需要连接db,连接db有很多配置信息。

系统中需要发送邮件,发送邮件需要配置邮件服务器的信息。

还有其他的一些配置信息。

我们可以将这些配置信息统一放在一个配置文件中,上线的时候由运维统一修改。

那么系统中如何使用这些配置信息呢,spring中提供了@Value注解来解决这个问题

通常我们会将配置信息以key=value的形式存储在properties配置文件中。

通过@Value("${配置文件中的key}")来引用指定的key对应的value。

@Value使用步骤

步骤一:使用@PropertySource注解引入配置文件

将@PropertySource放在类上面,如下

@PropertySource({
   "配置文件路径1","配置文件路径2"...})

@PropertySource注解有个value属性,字符串数组类型,可以用来指定多个配置文件的路径。

如:

@Component
@PropertySource({ "classpath:com/javacode2018/lesson002/demo18/db.properties"})
public class DbConfig {
}
步骤二:使用@Value注解引用配置文件的值

通过@Value引用上面配置文件中的值:

语法

@Value("${配置文件中的key:默认值}")
@Value("${配置文件中的key}")

如:

@Value("${password:123}")

上面如果password不存在,将123作为值

@Value("${password}")

上面如果password不存在,值为${password}

假如配置文件如下

jdbc.url=jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8
jdbc.username=javacode
jdbc.password=javacode

使用方式如下:

@Value("${jdbc.url}")
private String url;

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

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

下面来看案例

案例
来个配置文件db.properties
jdbc.url=jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8
jdbc.username=javacode
jdbc.password=javacode
来个配置类,使用@PropertySource引入上面的配置文件
package com.javacode2018.lesson002.demo18.test1;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;

@Configurable
@ComponentScan
@PropertySource({ "classpath:com/javacode2018/lesson002/demo18/db.properties"})
public class MainConfig1 {
}
来个类,使用@Value来使用配置文件中的信息
package com.javacode2018.lesson002.demo18.test1;

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

@Component
public class DbConfig {

    @Value("${jdbc.url}")
    private String url;

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

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

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "DbConfig{" +
                "url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", pa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值