org.aeonbits.owner

OWNER是一款Java库,旨在简化应用程序中properties文件的处理流程。它提供了多种特性,如自动解析、热加载、类型转换等,使得配置文件管理变得更加高效便捷。

转载自:
http://hao.jobbole.com/owner/
http://blog.youkuaiyun.com/BestandW1shEs_lsy/article/details/78706790

  OWNER是一个Java库,目标是最大限度的减少应用程序中处理properties的代码。
  OWNER的主要功能:

  • 加载策略:OWNER通过匹配接口类名和properties文件名自动解析并映射;也可以通过注解定制properties文件名。
  • 导入properties:另外一种加载properties文件到映射接口的方法。
  • 参数化properties:另外一个实用功能,给接口方法提供参数,通过参数配置。
  • 类型转换:支持从String类型到基本类型和枚举类型的转换。
  • 变量扩展:引用properties中的其他属性。
  • 热加载:支持热加载。
  • 可访问和可变:可以继承Config的子接口Accessible或者Mutable实现属性的可访问和可变。
  • 调试:支持调试功能。
  • 禁用功能:可禁用引起问题的功能。
  • 配置ConfigFactory:ConfigFactory也是可配置的。
  • XML支持:支持XML配置。
  • 事件支持:OWNER实现了功能丰富的事件系统,使你知道热加载的发生和属性变化。
  • 单例模式:配置信息在一个应用中是单例的。


简单使用:(org.aeonbits.owner:owner-java8:1.0.10)
ServerConfig.java

import org.aeonbits.owner.Config;

@Config.Sources({ "classpath:ServerConfig.properties" })
public interface ServerConfig extends Config {

    @Key("server.http.port")
    int port();

    @Key("server.host.name")
    String hostname();

    @DefaultValue("42")
    int maxThreads();
}

ServerConfig.properties

server.http.port=80
server.host.name=foobar.com
maxThreads=100

测试代码:

import org.aeonbits.owner.ConfigFactory;

public class Test {
    public static void main(String[] args) {
        ServerConfig config = ConfigFactory.create(ServerConfig.class);
        System.out.println(config.port() + "," + config.hostname() + "," + config.maxThreads());
    }
}

看例子大概就应该知道如何使用了。

  @Sources注解是加载策略,支持classpath和file两种方式,可以接受多了value值,”,”分隔。如果设置多个值时,会按照优先级顺序使用对应的属性文件,即顺序加载属性文件,找到一个文件,其他文件就被忽视。这是因为默认的加载策略是@LoadPolicy(LoadType.FIRST),也可以在@Sources上面使用@LoadPolicy注解来指明其它的加载方式,例如LoadType.MERGE,这种方式是加载所有属性文件,但是优先级顺序读取属性值,第一次获取到属性值后,后面文件中有相同属性就不会再读取。

  @DefaultValue的值代表的是该接口方法对应属性的默认值。当接口方法中不能在属性文件中找到对应的属性时,如果没设置默认值,String类型就会返回null,int类型就会报NullPointerException。通过设置默认值,来防止程序报错。

  除了使用配置文件还可以采用其它方式来完成类的属性配置。

import org.aeonbits.owner.Config;

public interface ServerConfig1 extends Config {

    @Key("server.http.port")
    int port();

    @Key("server.host.name")
    String hostname();

    @Key("server.max.threads")
    @DefaultValue("42")
    int maxThreads();
}
Properties props = new Properties(); // map也可以
props.setProperty("server.http.port", "8080");
props.setProperty("server.host.name", "foobar.com");
props.setProperty("server.max.threads", "100");

ServerConfig1 config1 = ConfigFactory.create(ServerConfig1.class, props);
System.out.println(config1.port() + "," + config1.hostname() + "," + config1.maxThreads());

类型转换:

/*
 * 数组和集合的类型转换:
 * @Separator与@TokenizerClass可以用在方法上,只影响该方法;也可以用在类上,影响整个类
 * @Separator和@TokenizerClass不能在同一级别上使用,否者会抛UnsupportedOperationException
 */
public interface MyConfig extends Config {

    @DefaultValue("3.1415")
    double pi();

    // 默认情况下,OWNER使用逗号","字符为数组和集合标记值  
    @DefaultValue("apple, pear, orange")
    public String[] fruit();

    // 用@Separator注释指定不同的字符(和regexp)  
    @Separator(";")
    @DefaultValue("0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55")
    public int[] number();

    @DefaultValue("1, 2, 3, 4")
    List<Integer> ints();

    // 复杂的拆分逻辑可以自定义,使用@TokenizerClass注解  
    @TokenizerClass(MyTokenizer.class)
    @DefaultValue("foo-bar-baz")
    public String[] customize();
}  
/*
 * String[] split(String regex, int limit):limit 参数控制模式应用的次数,因此影响所得数组的长度。
 * 如果该限制n大于 0,则模式将被最多应用 n-1次,数组的长度将不会大于n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。
 * 如果n为负,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。
 * 如果 n为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
 */
public class MyTokenizer implements Tokenizer{

    // 需要复杂的的逻辑可以自定义  
    public String[] tokens(String values) {
        return values.split("-", -1);
    }
}  

变量扩张:

/*
 * 变量扩展:
 * 屬性之间的值可以相互使用
 */
public interface ExpandConfig extends Config {
    String story();
    String animal();
    String target();

    @Key("target.attribute")
    String targetAttribute();

    String color();
}  
story=The ${animal} jumped over the ${target}  
animal=quick ${color} fox  
target=${target.attribute} dog  
target.attribute=lazy  
color=brown

  OWNER还实现了重载与热重载,使用Reloadable接口和@HotReload注解来实现,具体使用请参考转载的文章。

<think>好的,我现在需要帮助用户查找与数据库对象名称相关的概念或用法,特别是关于“database owner object_name”在SQL或数据库系统中的内容。用户还提供了三个引用,我需要结合这些引用来构建答案。 首先,用户提到的引用[1]提到了主数据库存储系统目录和用户数据库的配置信息,这让我想到系统目录中可能存储了关于数据库对象的元数据,比如表、视图、存储过程等的信息。系统目录通常包含对象的所有者、名称、类型等,所以可能需要解释对象的所有者(owner)和对象名称(object_name)的概念。 引用[2]看起来像是Oracle数据库中的脚本,涉及coe_load_sql_profile.sql,这可能与SQL调优有关,但不太直接相关。不过,可能涉及到数据库对象的管理,比如执行脚本时需要指定对象的所有者或名称。 引用[3]是关于删除表统计信息的PL/SQL代码,其中明确使用了ownname和tabname参数,也就是所有者和表名。这直接关联到数据库对象的所有权和名称,因为在执行这类操作时,必须指定对象的所有者(user_name)和对象名称(table_name)。这说明在数据库操作中,对象名称和所有者是必须的,尤其是在多用户环境下,确保唯一性和权限控制。 接下来,我需要整理数据库对象名称相关的概念。数据库对象通常包括表、视图、索引、存储过程等,每个对象都有一个名称(object_name),并且在数据库中必须唯一,通常是在其所属的模式(schema)下唯一。模式由所有者(owner)决定,也就是创建该对象的用户。例如,在Oracle中,对象名称为全限定名可能表示为owner.object_name,如HR.EMPLOYEES,其中HR是所有者,EMPLOYEES是表名。 此外,权限管理方面,所有者通常对该对象拥有全部权限,并可以授权其他用户访问。这在引用[3]中的例子中体现,因为删除统计信息需要指定ownname,即所有者,这涉及到权限问题。 关于SQL中的使用,比如在查询系统视图(如DBA_OBJECTS)时,可以查看所有对象及其所有者。例如,查询DBA_TABLES会列出所有表及其所有者,这关联到引用[1]中提到的系统目录存储的信息。 可能还需要提到对象命名规范,比如长度限制、合法字符等,不同数据库系统可能有不同规定,但用户的问题更侧重于概念和用法,而不是具体细节。 现在需要确保回答结构清晰,分点说明,并引用提供的参考资料。例如: 1. 数据库对象的基本结构:对象名称和所有者,唯一性。 2. 权限管理中的角色,如所有者拥有权限。 3. 在SQL操作中的使用,如引用[3]中的例子。 4. 系统目录中的存储,如引用[1]提到的系统目录信息。 同时,生成相关问题时要围绕数据库对象名称和所有者的相关知识点,比如唯一性、权限、系统视图查询等。 需要检查是否所有引用的内容都被合理使用,特别是引用[1]关于系统目录,引用[3]中的ownname和tabname参数的使用。引用[2]可能关联性较低,但用户可能希望看到所有引用都被考虑,所以可能需要提到在脚本中指定对象所有者的情况,如执行脚本时需要提供所有者名称,确保操作正确的对象。 最后,确保回答使用中文,LaTeX格式正确,问题部分符合要求。</think>[系统级回答] 在数据库系统中,数据库对象名称的结构通常遵循$owner.object\_name$的三段式命名规范,其核心要素包括: 1. **对象所有者(Owner)** - 表示对象的归属账户,对应数据库用户身份 - 在Oracle中通过$CREATE TABLE hr.employees(...)$显式指定[^1] - 控制访问权限的基础单位,如引用[3]删除统计信息时需指定$ownname$参数 2. **对象名称(Object Name)** - 命名规则: $$length \leq 30 \text{字符(Oracle)}$$ $$首字符必须为字母$$ $$禁止使用SQL保留字$$ - 唯一性约束:在同一个schema下具有唯一性 3. **系统级关联** - 系统视图$DBA\_OBJECTS$存储全量对象信息: ```sql SELECT owner, object_name, object_type FROM dba_objects WHERE object_name LIKE 'EMP%' ``` - 主数据库通过系统目录维护对象元数据 : 主数据库存储系统目录详细信息和用户数据库的配置详细信息 [^3]: 统计信息删除操作需明确指定对象归属
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值