Java属性文件绑定到Java接口

Java属性文件绑定到Java接口,java,api,properties,configuration,Java,Api,Properties,Configuration,使用GWT,您可以获得如下内容: public interface LoginConstants extends Constants { @DefaultStringValue("Wellcome to my super app") @Key("appDescription") String appDescription(); @DefaultStringValue("Ok") @Key("okButtonLabel") String okButtonLab

使用GWT,您可以获得如下内容:

public interface LoginConstants extends Constants {
   @DefaultStringValue("Wellcome to my super app")
   @Key("appDescription")
   String appDescription();

   @DefaultStringValue("Ok")
   @Key("okButtonLabel")
   String okButtonLabel();
}
然后,您可以从执行GWT.create(LoginConstant.class)的类中使用,通过这种方式,接口由动态实现支持,当我调用loginConstants.appDescription()时,该实现使用@Key注释返回属性文件中包含的值,以引用属性文件中的键。如果属性文件缺少该属性,则返回de@DefaultStringValue。这用于国际化,但也可能用于配置。 但对于GWT,这意味着要在客户端(即转换为JavaScript)上使用,并用于i18n,而不是用于配置

但是,我发现这个想法对于配置处理也非常方便

我想知道是否有人知道一个框架可以在服务器端做类似的事情,而不必将代码绑定到GWT。即,如果有任何库实现了专门为配置处理而设计的这种逻辑。我不知道有这样的事


参考GWT中的功能:

您可以用spring来模拟它(但我不确定它是否值得):


有了一个。

我非常喜欢这个想法,所以我很快就用它组装了一些代码

因此,基本上您创建了一个具有相关方法的接口,并使用@Key、@DefaultStringValue注释对其进行注释

下面是示例Java代码:

Main.java

package net.viralpatel;

import net.viralpatel.annotations.DefaultStringValue;
import net.viralpatel.annotations.Key;

interface LoginConstants extends Constants {
       @DefaultStringValue("Wellcome to my super app")
       @Key("appDescription")
       String appDescription();

       @DefaultStringValue("Ok")
       @Key("okButtonLabel")
       String okButtonLabel();
}

public class Main {
    public static void main(String[] args) {
        LoginConstants constants = DynamicProperty.create(LoginConstants.class);
        System.out.println(constants.appDescription());
        System.out.println(constants.okButtonLabel());
    }
}
我们加载的后台属性文件也是

配置属性

okButtonLabel=This is OK
只需执行主java类,将显示以下输出:

输出:

Wellcome to my super app 
This is OK

下面是代码的其余部分:

< P>我想把CDI看作如下:-< /P> 限定词 制作人 服务配置 工人阶级 关于上面的编码,您可以使用
java.util.Properties
而不是
java.util.ResourceBundle
,并为限定符提供默认成员

如果您在JavaEE6下运行这些,那么CDI已经为您启用了。只需将空的beans.xml放入META-INF或WEB-INF即可。如果您是在Java SE下运行的,则可能需要进一步的工作,如和中所述

我正在使用CDI作为我当前生产项目的主要部分,它运行得非常好

编辑:-

使用CDI的好处在于作用域,我们可以将
@MessageTemplate
生成为
@ApplicationScope
@SessionScoped
@RequestScoped
@ConversationScoped
@dependent
的伪作用域


如果您将MyServiceConfigure注释为
@Named
,它也可以在JSF上使用。

我实现了我自己的问题解决方案:

基本用法

所有者API使用的方法是定义Java接口 与属性文件关联

假设您的属性文件定义为
ServerConfig.properties

port=80
hostname=foobar.com
maxThreads=100
要访问此属性,需要定义一个方便的Java接口 在
ServerConfig.java
中:

public interface ServerConfig extends Config {
    int port();
    String hostname();
    int maxThreads();
}
我们将此接口称为属性映射接口或 映射接口,因为它的目标是将属性映射到易于使用的 使用一段代码

然后,您可以从代码内部使用它:

public class MyApp {
    public static void main(String[] args) {
        ServerConfig cfg = ConfigFactory.create(ServerConfig.class);
        System.out.println("Server " + cfg.hostname() + ":" + cfg.port() +
                           " will run " + cfg.maxThreads());
    }
}
但这只是冰山一角

继续阅读这里:| | | |

我仍在考虑一些特性,但当前的实现比问题中描述的基本功能要向前推进一点


我需要添加示例和文档。

我不是spring的忠实粉丝。我希望避免将依赖项添加到SpringJAR中,对于我正在设计的配置类型,我更喜欢属性文件而不是xml。@Value注释的语法非常好,因为方法签名可以猜测值的类型,而且在GWT中是rendundat。谢谢,它看起来很棒。我现在应该雇用你:)哈哈:)我正在去杜塞尔多夫Hbf的路上:有趣的功能,很好的网站,与平淡乏味的文档完全不同(也许对我来说有点太丰富了,但仍然可读)。我已经编辑了你的答案,包括你提供的链接中的基本用法。
public class MyServiceConfigure {
    @Inject
    @MessageTemplate(baseName = "com.my.domain.MyProp",
                     key      = "appDescription")
    private String appDescription;

    @Inject
    @MessageTemplate(baseName = "com.my.domain.MyProp",
                     key      = "okButtonLabel")
    private String okButtonLabel;

    //Getter
}
public class MyService {
    @Inject
    private MyServiceConfigure configure;

    public void doSomething() {
        System.out.println(configure.getAppDescription());
        System.out.println(configure.getOkButtonLabel());
    }
}
port=80
hostname=foobar.com
maxThreads=100
public interface ServerConfig extends Config {
    int port();
    String hostname();
    int maxThreads();
}
public class MyApp {
    public static void main(String[] args) {
        ServerConfig cfg = ConfigFactory.create(ServerConfig.class);
        System.out.println("Server " + cfg.hostname() + ":" + cfg.port() +
                           " will run " + cfg.maxThreads());
    }
}