基础知识
1、定义
Owner是一个java库,其目标是通过java属性文件来最小化处理应用程序的代码。
说人话:
以注解的方式来简化属性配置。
2、引入依赖
g:org.aeonbits.owner
a:owner
v:1.0.9
以上适用于java1.7及之前的jdk版本,java1.8时a坐标应该是owner-java8
3、使用
A、接口继承Config。
B、接口上添加@Config.Sources({属性文件1[,属性文件2....]})
注意:如果接口和属性文件在同一个包下且同名,则不同添加这个注解。但是这个属性文件必须定义
为资源文件且指定编译路径。
接口名:SparkConfig 属性文件名:SparkConfig.properties 这叫同名
C、接口中定义具有返回值的无参方法,方法上使用@Key("属性文件中属性的key")即可注入属性文件中属
性的value。
注意:若接口和属性文件在同一个包下且同名,则接口内方法会自动获取属性文件同名key的
value值,不需要使用@Key注解。
D、接口中定义具有返回值的无参方法,方法上使用@DefaultValue("默认值")可给成员属性定义默认
值,当属性文件无法提供value注入的时候,成员属性的值就是默认值。
注意:如果没有默认值,属性文件中又无法找到可以注入的value,返回值为String类型返回null,
int等基本类型返回空指针异常。
E、除了属性文件中配置属性key-value外,还可以通过Properties ps=new Properties();
ps.setProperties("key","value");方式来配置key-value。
F、在配置类中通过:
public static final SparkConfig=ConfigFactoy.create(SparkConfig.class);创建对象spark,
而spark对象则拥有属性文件中所有属性key的value值。通过spark.方法名即可获取。
当属性是通过Properties类引入时,创建spark对象还有第二个参数, 即Properties类的对象。
2、Owner的几个常见功能
A、加载策略
@Config.Sources({classpath:a.properties,classpath:b.properties})
加载策略有FIRST(默认)和MERGE两种,可以在接口上通过@LoadPolicy(LoadType.FIRST)进行配置。
FIRST:找到了a.properties则使用a.properties,否则尝试找b.properties,找到了就使用
b.properties。如果b.properties也没找到,就使用@DefaultValue中的默认值。
MERGE:找到了a.properties则使用a.properties,当接口内有方法无法注入value时则尝试在
b.properties中寻找value注入,若b.properties也无法提供注入,则该方法就使用@DefaultValue中
的默认值,而其他的方法则依然使用a.properties进行注入。
B、类型转换
如果要注入的value值是集合&数组等数据结构,则value值应当以逗号分隔。如果不是,可以通过
@Separator("-")注解指定分隔符。
如果分隔原则非常复杂,则可以定义个继承Tokenizer的分隔符,在抽象方法上@TokenizerClass("分隔
类类对象");来引入复杂的分割原则。
C、变量扩张
属性文件中属性A的value中可以通过${B}来应用属性文件中属性B的value。
D、热加载
在接口上中添加@HotReload,当属性文件的值改变时,会重新加载属性文件。
当然啦,@Config.Sources()中配置的属性文件必须以"file:"、"classpath:"、"jar:"开头,
“ftp:”、“http:”这种就不行。
@HotReload默认重新加载时间间隔为5s,可以@HotReload(5)配置。
使用代码
FlexppExtConfig .java
import org.aeonbits.owner.Config;
import org.aeonbits.owner.Config.LoadPolicy;
import org.aeonbits.owner.Config.LoadType;
import org.aeonbits.owner.Config.Sources;
import org.aeonbits.owner.Config.HotReload;
import org.aeonbits.owner.ConfigFactory;
import java.util.Map;
@HotReload(1)
@LoadPolicy(LoadType.FIRST)
@Sources({"file:${user.dir}/config/MdlpConfig.properties", "classpath:MdlpConfig.properties"})
public interface MdlpConfig extends Config {
MdlpConfig INSTANCE = (MdlpConfig) ConfigFactory.create(MdlpConfig.class, new Map[0]);
@DefaultValue("")
String ldapUrl();
}
TestController.java
import com.hanhe.mdlp.system.config.MdlpConfig;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
public class TestController {
@GetMapping("test")
@ResponseBody
public Object test(){
//获取配置项中的ldapUrl
String ldapUrl = MdlpConfig.INSTANCE.ldapUrl();
return ldapUrl;
}
}