拥有使用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。
我会使用动态生产者,使用Qualifier来标识所需的环境
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预期的实现。
Greeting
GreetingFactory
@Producer