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

多个CDI配置文件(devel,beta,qa,生产)在一个战争?

龙枫
2023-03-14

有了Spring DI ApplicationContext.xml声明依赖注入的经验,我现在试图找出如何在Java EE6 CDI中做同样的事情。

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

使用CDI,我可以在beans.xml中使用@alternative和在web.xml中使用properties,但是似乎没有办法为不同的环境提供多个beans.xml。

我不想使用Maven配置文件/过滤器来生成4-6个版本的应用程序,尽管我明白对于某些场景来说,这将是更好的解决方案(即向客户发送准备好的构建WAR--但我只在内部使用wars,所以让我们节省编译时间!)

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

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

如果没有,截至2013年有哪些建议的替代方案?用Spring?接缝?盖斯?我看到了Apache DeltaSpike的提及,但从网页上看,它们似乎仍然是阿尔法·朱克。

共有1个答案

龙承颜
2023-03-14

我会使用动态生成器,使用限定符来标识所需的环境

// 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; }
     }

}

因此,容器在这里将所有可用的greeting实现注入到greetingFactory中,该实现又作为预期实现的@producer,并根据系统属性'deployenv'进行决策。

 类似资料:
  • 问题内容: 拥有使用Spring DI applicationContext.xml声明依赖项注入的方式的经验,我现在尝试弄清楚如何使用Java EE6 CDI进行相同的操作。 使用Spring,我可以将.jar附带几个配置文件,例如 unittest.xml,devel.xml,qa.xml,production.xml ,并使用命令行参数或环境变量激活它们。 随着CDI,我可以用@Altern

  • 1-我有一个带有Spring Boot的API,我需要配置两个DBMS(MySQL和Postgres)。 2-对于每个DBMS,我需要配置不同的配置文件。(Dev,Prod) 遵循我的MySQL配置类: 我以为我的出口是: 重要: 当我将配置文件配置为连接到我的MySQL Dev数据库时,我只想连接到它。我想要同样的结果,当它是MySQL的Prod的基础时。 当我将配置文件配置为连接到我的Post

  • 我有两个配置文件(“autoContido”和“weblogic”),其中每个配置文件都有两个配置类,因为我使用的是两个数据源。 我已经将特定数据源中的bean注释为@Primary,而另一个数据源配置类中的bean不是@Primary,但我对它们的命名不同。 我以为使用@主注释就不会有像下面这样的错误,但我仍然得到它们。有人能帮我看看问题出在哪里吗? 我尝试使用@Primary annotati

  • 寻找在Springboot应用程序中配置多个配置文件特定属性文件的最佳方法。下面是一个例子: -资源  · --application.properties  · · · · · --德夫             --application-dev.properties             --ldap-dev.properties             --Quartz-Dev.Prope

  • 我们使用的是Spring boot。我们有三个环境、、。我们当前的配置结构 开发 同样,对于每个环境,我们都有一个yml和属性文件。经过一年的开发,现在配置文件的单个yml文件变成了一个大型单片配置文件。 对于下面这样的配置文件,可以有多个配置文件吗?

  • 我正在用Java 11和Maven创建一个测试框架,并且我已经为单独的测试构建了两个不同的运行程序。我只想运行一个配置文件,但它一直运行两个配置文件。以下是我的个人资料: