Java属性文件绑定到Java接口
使用GWT,您可以获得如下内容: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
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());
}
}