一、介绍
是不是经常用
@Value
注解?用过
springboot
的都知道它是从
application.properties
文件中引入某个变量的值,是不是已经灰常熟悉了?
默认在
springboot
启动后,加载
application.properties
文件,通过
@Value("${}")
,即可获取到对应的值,使用非常方便。
当然使用久了,发现太多的变量配置到
application.properties
文件中,就会想到配置一个自定义参数文件,让
@Value("${}")
这样的方式取值不要再从
application.properties
中获取,而从自定义的参数文件中获取。
二、理解
实现方法即重新对
PropertyPlaceholderConfigurer
类的
setLocations()
方法重新指定配置文件路径就可以了。
通过
PropertyPlaceholderConfigurer
可以实现将上下文属性信息放在一个properties文件中,同时还可以通过
System.setProperty(key, value)
这种方式,给容器传递其他参数。
三、方法
1、加配置类
配置方法和
spring
一样,都是通过加配置类,当然
springboot
只需要加一个这样的配置类:
import org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
/**
* Created by lingsf on 2019/6/20.
* 重新修改@Value注解注入的路径
*/
@Configuration
public class ValueConfig {
@Bean
public PreferencesPlaceholderConfigurer getPreferencesPlaceholderConfigurer(){
PreferencesPlaceholderConfigurer configurer = new PreferencesPlaceholderConfigurer();
Resource resource = new ClassPathResource("/data.properties");
configurer.setLocation(resource);
return configurer;
}
}
其中上边的
data.properties
即是新的配置文件路径。
2、加参数文件
然后在
resources
下加一个
data.properties
文件即可。
最后就可以在
data.properties
文件里配置自己的参数。
spring.file.uploadpath=c:/upload/wfvideo
3、使用
使用没有变化,还是使用最方便的
@Value("${spring.file.uploadpath}")
方式即可,你会发现配置内容都是从
data.prooperties
文件来了,实现了与
application.properties
的分离。
四、问题
又回到开始,为什么
@Value
注解读配置文件时,会默认从
application.properties
来获取呢?它是如何知道它呢?
个人理解:
我还没看源码(看不懂~~),首先
application.properties
文件在
springboot
启动后,会加载到容器中,里边的配置参数已经进入到
spring
上下文,维护进一个地方,并且以map那种形式,
key=value
键值对存储。
这时候,你通过对
PropertyPlaceholderConfigurer
类的
setLocations()
方法重新指定配置文件,并写了一个
data.properties
文件,这时候
data.properties
里也相当于加入到
spring
前边维护配置信息的map中,但是map的特性都知道,如果有重名的
key
,那肯定以后者为主。
所以这么看来,并不是
@Value
注解,开始就认识
application.properties
文件,而是它压根不是从
application.properties
文件中获取东西,也不认识
application
,而是从它们共同的老板,
spring
上下文维护的一个配置类中,类似刚才说到的一个map的东西中找东西,而里边的东西默认是
application.properties
文件中填进去的而已。
个人感觉可能是这么回事,可能不对~~~