Configuration 使用“依赖项注入”;。物业;文件

Configuration 使用“依赖项注入”;。物业;文件,configuration,dependency-injection,annotations,java-ee-6,cdi,Configuration,Dependency Injection,Annotations,Java Ee 6,Cdi,我正在使用JavaEE6,需要从“.properties”文件加载配置。是否有建议的方法(最佳实践)来加载值​​从配置文件使用依赖项注入?我在Spring中找到了这方面的注释,但还没有找到JavaEE的“标准”注释 这家伙从零开始开发了一个解决方案: “我找不到如何配置应用程序的简单示例 通过从文件读取配置属性来使用CDI…” 但是我想知道是否有一种更标准的方法来代替创建配置工厂…即使它没有完全涵盖您的问题,您可能会对焊接文档感兴趣 提到这一点-不,没有标准的方法注入任意资源/资源文件。我想标

我正在使用JavaEE6,需要从“.properties”文件加载配置。是否有建议的方法(最佳实践)来加载值​​从配置文件使用依赖项注入?我在Spring中找到了这方面的注释,但还没有找到JavaEE的“标准”注释

这家伙从零开始开发了一个解决方案:

“我找不到如何配置应用程序的简单示例 通过从文件读取配置属性来使用CDI…”


但是我想知道是否有一种更标准的方法来代替创建配置工厂…

即使它没有完全涵盖您的问题,您可能会对焊接文档感兴趣


提到这一点-不,没有标准的方法注入任意资源/资源文件。我想标准化这种高度依赖于定制的需求已经超出了规范的范围(Spring不是规范,他们可以随意实现)。然而,CDI提供的是一种强大的(也称为类型安全)机制,用于在一侧注入持有配置的bean,以及一种灵活的生产者机制,用于在另一侧读取和创建此类bean。这绝对是你所问的推荐方式

您链接到的方法当然是一种非常好的方法——尽管它可能会让我无法满足您的需求,这取决于您计划注入的属性类型

一种非常类似CDI的方法是开发一个CDI扩展(可以很好地封装所有必需的类),并将其与您的项目一起独立部署。当然,你也可以为公司做出贡献

实现这一点的唯一“标准”方法是将限定符与非绑定注释成员一起使用,并确保所有注入都是依赖范围的。然后在你的制作人中,你可以获得注入点,并在注入点中从限定符中获得密钥。你会想要这样的东西:

@限定符
public@interface属性{
@非绑定字符串值默认为“”;
}
...
@注入@Property(“myKey”)字符串myKey;
...
@生成@Property公共字符串getPropertyByKey(注入点ip){
Set qualifiers=ip.getQualifiers
//循环查找Property.class的限定符保存该限定符
返回ResourceBundle.getBundle(…).getString(property.key);
}

显然,您可以对该代码进行一些增强,但这应该足以让您走上正确的道路。

请参阅Apache DeltaSpike的@ConfigProperty

配置注释

package com.ubiteck.cdi;
导入java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
导入javax.enterprise.util.Nonbinding;
导入javax.inject.Qualifier;
@限定词
@保留(RetentionPolicy.RUNTIME)
public@interface InjectedConfiguration{
/**
*捆绑密钥
*@返回有效的捆绑密钥或“”
*/
@非绑定字符串键()默认为“”;
/**
*这是强制性财产吗
*@return true if mandator
*/
@非绑定布尔强制()默认为false;
/**
*默认值(如果未提供)
*@返回默认值或“”
*/
@非绑定字符串defaultValue()默认值“”;
}
配置工厂可能看起来像:

导入java.text.MessageFormat;
导入java.util.MissingResourceException;
导入java.util.ResourceBundle;
导入javax.enterprise.inject.products;
导入javax.enterprise.inject.spi.InjectionPoint;
公共类配置导入管理器{
静态最终字符串无效\u KEY=“无效键”{0}”;
静态最终字符串MANDATORY_PARAM_MISSING=“未找到强制配置参数的定义:{0}”;
私有最终字符串包\u文件\u NAME=“配置”;
私有最终ResourceBundle bundle=ResourceBundle.getBundle(bundle\u FILE\u NAME);
@产生
@注入配置
公共字符串injectConfiguration(InjectionPoint ip)引发IllegalStateException{
InjectedConfiguration参数=ip.getAnnotated().getAnnotation(InjectedConfiguration.class);
if(param.key()=null | | param.key().length()=0){
返回参数defaultValue();
}
字符串值;
试一试{
value=bundle.getString(param.key());
if(value==null | | value.trim().length()==0){
if(参数必须为()
抛出新的IllegalStateException(MessageFormat.format(强制参数缺失,新对象[]{PARAM.key()}));
其他的
返回参数defaultValue();
}
返回值;
}捕获(丢失资源异常e){
如果(param.mandatory())抛出新的非法状态异常(MessageFormat.format(mandatory_param_MISSING,new Object[]{param.key()}));
return MessageFormat.format(无效的_键,新对象[]{param.KEY()});
}
}

“Spring不是规范,他们可以随心所欲地实现”-是的,但规范不是从天上来的。有人写了它,就像有人写了Spring一样。谢谢!我们如何以编程方式更改捆绑包的文件名?例如,程序A可以使用“A.properties”和程序B“B.properties”但希望共享此代码。如何定义要注入的文件?从何处读取?