当前位置: 首页 > 知识库问答 >
问题:

使用“。属性”文件的依赖注入

梁俊智
2023-03-14

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

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

http://weblogs.java.net/blog/jjviana/archive/2010/05/18/applicaction-configuration-java-ee-6-using-cdi-simple-example

“我找不到一个简单的例子,说明如何通过从文件中读取配置属性来使用CDI配置应用程序……”

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

共有3个答案

万坚壁
2023-03-14

请参阅Apache DeltaSpike的@ConfigProperty

艾心远
2023-03-14

尽管它并没有完全涵盖您的问题,但您可能会对焊接文档的这一部分感兴趣。

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

您链接到的方法当然是一个相当好的方法——尽管它可能对您的需求来说太多了,这取决于您计划注入的属性类型。

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

朱海超
2023-03-14

配置注释

package com.ubiteck.cdi;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectedConfiguration {
    /**
     * Bundle key
     * @return a valid bundle key or ""
     */
    @Nonbinding String key() default "";
    /**
     * Is it a mandatory property
     * @return true if mandator
     */
    @Nonbinding boolean mandatory() default false;
    /**
     * Default value if not provided
     * @return default value or ""
     */
    @Nonbinding String defaultValue() default "";
 }

配置工厂可能看起来像:

import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;

public class ConfigurationInjectionManager {
    static final String INVALID_KEY="Invalid key '{0}'";
    static final String MANDATORY_PARAM_MISSING = "No definition found for a mandatory configuration parameter : '{0}'";
    private final String BUNDLE_FILE_NAME = "configuration";
    private final ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_FILE_NAME);

    @Produces
    @InjectedConfiguration
    public String injectConfiguration(InjectionPoint ip) throws IllegalStateException {
        InjectedConfiguration param = ip.getAnnotated().getAnnotation(InjectedConfiguration.class);
        if (param.key() == null || param.key().length() == 0) {
            return param.defaultValue();
        }
        String value;
        try {
            value = bundle.getString(param.key());
            if (value == null || value.trim().length() == 0) {
                if (param.mandatory())
                    throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()}));
                else
                    return param.defaultValue();
            }
            return value;            
        } catch (MissingResourceException e) {
            if (param.mandatory()) throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()}));
            return MessageFormat.format(INVALID_KEY, new Object[]{param.key()});
        }
    }

带解释和阿奎利安测试的教程

 类似资料:
  • 我创建了一个自定义验证属性,我想将其用于 API 控制器 DTO。此属性需要来自已配置选项的值,这就是我在构造函数中注入这些值的原因,以便我以后可以在 和 方法中使用选项服务。 不幸的是,当我想在DTO中将其用作属性时 我收到错误信息 没有给出对应于'MyValidationAttribute.MyValidationAttribute(IOptionsMonitor)'所需形式参数'myOpti

  • 我很难理解WPF中的依赖属性,可能是因为我要找的用例非常具体,没有很好的文档化。 我有一个自定义控件,看起来像这样(请忽略所有可怕的代码,这是暂时的!): 我这样称呼它在我的主窗口内: 我只想在主窗口中的自定义控件调用中说: (其中fillPercent是另一个脚本中不需要担心的内容)。该控件将被展开,因此需要保持为自定义控件。我明白我可能需要依赖属性,但在尝试了许多不同的方法后,我无法弄清楚如何

  • 问题内容: Spring在以下方面很好地支持JUnit:使用和注释,事情看起来非常直观 该测试将能够在Eclipse&Maven中正确运行。我想知道TestNG是否有类似的东西。我正在考虑迁移到“下一代”框架,但没有找到与Spring测试匹配的对象。 问题答案: 它也可以与TestNG一起使用。

  • 问题内容: 我为该标题表示歉意。我找不到更好的方法来解释这种情况。 我使用URL http://www.exampledepot.com/egs/java.util/Props.html中所述的Property类加载属性文件。 我的问题是我可以在该属性文件中使用属性吗? 例: test.properties 其他语法有可能吗? 谢谢 问题答案: 以前从未见过。您当然 可以 制作自己的预处理器。只要

  • 1. 前言 上一节,我们演示了如何使用 xml 文件配置,实现属性的依赖注入。但是,注入的依赖类型只是作为演示使用的两种, 而一个类中的属性,可能会多种多样。那么,xml 配置文件如何实现其余类型的属性注入呢? 我们进入本节的学习内容。 2. 多种类型依赖注入 2.1 属性类型分类 基本类型包装类,比如 Integer、Double、Boolean; 字符串类型,比如 String; 类类型,比如

  • 例如,我有一个bean类 我想设置这个属性的值。 在Xml配置中,我可以 我如何实现同样的事情,即设置属性的值使用Java注释?现在我已经读到,我们可以使用@Value注释使用一些属性文件,但它不能不使用属性文件,做的方式,我通过xml文件?或者使用属性文件是必要的? 我可以通过包含