每个(几乎所有)Java EE 应用都需要参数配置——本地、测试或者产品,这是常见且合理的事情;但是,如何轻松地维护这些配置以及如何无缝地处理随着应用物理环境的迁移引起的配置参数的变更?这是很值得思考的问题。
似乎已经有许多方法可以解决以上的需求,那么在本文中,我将把众多基于CDI配置方案中的一种,Owner ,介绍给大家。
通常在一个系统中使用properties配置有这样几种操作:
- 硬编码式的属性配置(通常新手程序员会这样做,好一点的方式是将其处理为常量属性)
- 配置文件放置于war中(各种配置在build过程中被引入,这样是不可取的,因为同样配置不可能满足不一样的宿主环境)
- 配置文件放置于配置服务系统(配置文件从war中独立出来并且据不同宿主环境而变)
以上第3种应该即是配置方式进化后的产物,从配置服务系统拉取配置的动作依然不能少,很多时候可能需要编写自定义逻辑拉取并使用配置属性:
- 你需要自己管理属性注入
- 你需要使用具有灵活配置管理机制的spring框架,但能保证每次都仅仅通过spring管理获取配置文件吗?怕是不尽然
下面,进入编程正题!
前置条件
你需要具备以下环境完成整个编写测试过程
实现
定义一个接口
@HotReload
@Sources({
"classpath:my-app.properties","http://static.edgar.cc/api/contrast_code_zh_CN.properties", "classpath:my-app.properties" })
public interface ApplicationConfig extends Accessible {
@DefaultValue("40")
@Key("app.timeout")
int getInitialTimeout();
}
使用
public static void main(String[] args) {
ApplicationConfig applicationConfig = ConfigFactory.create(ApplicationConfig.class);
System.out.println(applicationConfig.getInitialTimeout());
}
属性文件位置查找机制:依次查找my-app.properties,如果找到一个文件则停止查找。
特点
- 多配置文件路径
- CDI Injection — Java EE based CDI injection using @Named and *@Inject *annotation
- 默认值 — 你可以用 @DefaultValue简单地配置默认值
- 热重载 — 你可以通过@HotReload快速地定义配置文件热重载间隔时间
- 如果需要,你可以找到更多的有效注解