一尘不染

在一次战争中有多个CDI配置配置文件(开发,测试版,质量保证,生产)?

java

拥有使用Spring DI applicationContext.xml声明依赖项注入的方式的经验,我现在尝试弄清楚如何使用Java EE6
CDI进行相同的操作。

使用Spring,我可以将.jar附带几个配置文件,例如 unittest.xml,devel.xml,qa.xml,production.xml
,并使用命令行参数或环境变量激活它们。

随着CDI,我可以用@Alternative beans.xml文件 和属性的 web.xml中
,但似乎没有出货多的beans.xml不同环境的方式。

我不希望使用Maven配置文件/过滤器来生成4-6版本的应用程序,尽管我知道在某些情况下这将是更好的解决方案(例如,将现成的构建大战运送给客户-
但我仅在内部使用大战,因此让我们节省编译时间!)

最好是,我还能够从文件系统中加载那些配置文件,以便系统管理员可以编辑它们,而不必重新构建应用程序。

具有多个依赖项和属性的配置集的Java EE6方法是什么?

如果没有,到2013年,推荐的替代方案是什么?使用Spring?接缝?帅哥 我看到了提到Apache
DeltaSpike的内容,但是从网页上看,它们仍然看起来像alpha。


阅读 184

收藏
2020-12-03

共1个答案

一尘不染

我会使用动态生产者,使用Qualifier来标识所需的环境

// The qualifier for the production/qa/unit test 
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD,
 ElementType.FIELD, ElementType.PARAMETER})
public @interface Stage {
   String value() default "production";
}

// The interface for the stage-dependant service
public interface Greeting{
    public String sayHello();
}

// The production service
@Stage("production")
public class ProductionGreeting implements Greeting{
    public String sayHello(){return "Hello customer"; }
}

// The QA service
@Stage("qa")
public class QAGreeting implements Greeting{
    public String sayHello(){return "Hello tester"; }
}

// The common code wich uses the service
@Stateless
public class Salutation{
   @Inject Greeting greeting; 
   public String sayHello(){ return greeting.sayHello(); };
}

// The dynamic producer
public class GreetingFactory{
    @Inject
    @Any
    Instance<Greeting> greetings;

    public String getEnvironment(){
         return System.getProperty("deployenv");
    }

    @Produces
    public Greeting getGreeting(){
        Instance<Greeting> found=greetings.select(
           new StageQualifier(getEnvironment()));
        if (!found.isUnsatisfied() && !found.isAmbiguous()){
           return found.get();
        }
        throw new RuntimeException("Error ...");
    }

    public static class StageQualifier 
      extends AnnotationLiteral<Stage> 
      implements Stage {
       private String value;

       public StageQualifier(String value){
           this.value=value;
       }
       public String value() { return value; }
     }

}

因此,此处容器根据系统属性“
deployenv”的决定将所有可用的Greeting实现注入到中GreetingFactory,而后者又用作@Producer预期的实现。

2020-12-03