《深入浅出Spring》@PropertySource、@Value注解及动态刷新实现

本文详细介绍了Spring框架中@Value和@PropertySource注解的使用,包括如何引入配置文件、引用配置信息。同时,文章讨论了如何实现@Value数据的动态刷新,通过自定义Scope实现配置信息的实时更新,以及在不重启应用的情况下让Spring容器中的配置生效。

@Value的用法

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

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

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

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

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

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

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

@Value使用步骤

步骤一:使用@PropertySource注解引入配置文件
将@PropertySource放在类上面,如下

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

如:

@Component
@PropertySource({
   
   "classpath:com/yuan11/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/mysql?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

使用方式如下:

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

@Value数据来源

通常情况下我们@Value的数据来源于配置文件,不过,还可以用其他方式,比如我们可以将配置文件的内容放在数据库,这样修改起来更容易一些。

我们需要先了解一下@Value中数据来源于spring的什么地方。

spring中有个类

org.springframework.core.env.PropertySource

可以将其理解为一个配置源,里面包含了key->value的配置信息,可以通过这个类中提供的方法获取key对应的value信息

内部有个方法:

public abstract Object getProperty(String name);

通过name获取对应的配置信息。

系统有个比较重要的接口

org.springframework.core.env.Environment

用来表示环境配置信息,这个接口有几个方法比较重要

String resolvePlaceholders(String text);
MutablePropertySources getPropertySources();

resolvePlaceholders用来解析${text}的,@Value注解最后就是调用这个方法来解析的。

getPropertySources返回MutablePropertySources对象,来看一下这个类

public class MutablePropertySources implements PropertySources {
   
   
    private final List<PropertySource<?>> propertySourceList = new CopyOnWriteArrayList<>();
}

内部包含一个propertySourceList列表。

spring容器中会有一个Environment对象,最后会调用这个对象的resolvePlaceholders方法解析@Value。

大家可以捋一下,最终解析@Value的过程:

  1. 将@Value注解的value参数值作为Environment.resolvePlaceholders方法参数进行解析
  2. Environment内部会访问MutablePropertySources来解析
  3. MutablePropertySources内部有多个PropertySource,此时会遍历PropertySource列表,调用PropertySource.getProperty方法来解析key对应的值

通过上面过程,如果我们想改变@Value数据的来源,只需要将配置信息包装为PropertySource对象,丢到Environment中的MutablePropertySources内部就可以了。

下面我们就按照这个思路来一个。

/**
 * 邮件配置信息
 */
@Component
public class MailConfig {
   
   
    @Value("${mail.host}")
    private String host;
    @Value("${mail.username}")
    private String username;
    @Value("${mail.password}")
    private 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值