基础知识

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;
    }

}

测试

访问http://localhost:8808/test/test

posted on 2022-08-12 11:18  Java愚公  阅读(45)  评论(0编辑  收藏  举报