目录
- 前言
- 读取配置文件方式
- 1.@Value注解
- 2.@ConfigurationProperties注解
- 3.使用 Environment
- 4.使用国际化功能
前言
springboot读取配置文件的方式与使用,都是老生常谈的话题了
写这篇文章,是因为项目中有个奇怪的需求:
提示语作为配置,方便修改
,我也不知道为啥有这种需求,也不是为了国际化,单纯的想改个文案而已
读取配置文件方式
使用配置文件的场景是必须的,比如数据库的配置,kafka,redis等配置都需要做配置文件,还有自定义配置,那么如何读取到呢?(只列举常用的)
只考虑配置不重名的情况,如果重名,搭配@PropertySource(“classpath:my.properties”) 使用
1.@Value注解
这是最简单的方式,在类属性上使用value注解,注解参数就是配置文件中的key值,就可以了,代码如下:
application.properties
person.age=10
person.name=jinitaimei
(使用yml也能生效,注意yml文件的格式即可)
person.java
public class StudentController {
@Value("${person.age}")
private String age;
@Value("${person.grand:xiaoming}")
private String grand;
}
启动项目后,age中就会有值了,也就是 10 , grand值是xiaoming,这是使用默认值,如果找不到配置就会使用默认值
任何类中都可以使用,不过一般会在控制层和业务层使用嘛;
默认值我用在swagger中,当做开关使用,默认为关,甚为好用
2.@ConfigurationProperties注解
如果你有大量的配置,比如redis的配置,使用value注解,就不太好用了, configurationProperties注解可以批量注入
@ConfigurationProperties(prefix = "person")
public class StudentController {
private String age;
private String name;
}
启动项目后,age和name属性就会有值,应该很容易看懂吧,如果找不到配置则不会注入;
prefix写不写都可以,这个注解做了别名,见其源码可知
3.使用 Environment
顾名思义,这个环境配置类,不光能读取配置文件,还能读取系统变量,比如jdk版本,当前操作系统类型,用户目录等等
import org.springframework.core.env.Environment;
public class BaseControll {
@Autowired
public Environment env;
private String getMessage() {
String property = env.getProperty("person.name", String.class, "defaultName");
return property ;
}
}
配上枚举做成返回码,甚是好用,项目的需求,我就是用这种方式做的,如下:
private String getMessage(ResponseEnum resultCode, Object[] objs) {
String property = env.getProperty(resultCode.getCode(), String.class, resultCode.getMsg());
return String.format(property, objs);
}
4.使用国际化功能
国际化就是为了满足不同地区的使用,简单的说,就是英文环境使用英文展示,中文环境使用中文展示,springboot支持很多语种,其原理就是,能读取对应的配置文件,从而展示不同语言内容,读取文件的方式是通过流读到一个map中 ,
国际化的读取和上面几种有点不同,国际化只能读取properties文件,
默认读取的配置文件是message.properties
,
中文配置文件名:message_zh_CN.properties
英文配置文件名:message_en_US.properties
会优先读取带环境的配置文件,如果找不到配置则会找默认的配置文件
若想更改默认配置文件名,在配置文件中加入配置: spring.messages.basename=responseCode
, 则会读取 responseCode.properties
,对应环境名也随之改变(多看看源码,了解其原理,这种东西就自然理解了,就不用费口舌了)
我们若仅使用它的读取配置文件功能,显得杀鸡用牛刀,所以这里简单描述一下,以后再补一篇国际化
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
public class BaseControll {
private static final Locale locale = LocaleContextHolder.getLocale();
@Resource
public MessageSource msg;
private String getMessage(ResponseEnum resultCode, Object[] objs) {
return msg.getMessage(resultCode.getCode(), objs,resultCode.getMsg(), locale);
}
}
我这里确定使用环境的方式是取当前时区,是最简单的方式,也是不准确的,合理的做法是,在通过请求header中的
accept-language
字段确定其环境或者前端传参数来确定,具体的可参考 https://www.jianshu.com/p/e2eae08f3255