@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的过程:
- 将@Value注解的value参数值作为Environment.resolvePlaceholders方法参数进行解析
- Environment内部会访问MutablePropertySources来解析
- 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

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

被折叠的 条评论
为什么被折叠?



