以编程方式注入不同的bean实现

时间:2014-05-08 10:32:58

标签: dependency-injection cdi

我有一个要求,我目前的项目是ejb3,jpa和jsf。我有一个核心开发项目和客户特定项目。在客户特定项目中,我们计划继承核心类并扩展或覆盖核心功能。因此,我们计划使用一些客户前缀创建客户特定的类。因此,在最终的war文件中,我们将拥有核心类和所有客户前缀类。例如,如果Authenticator是核心类和XXAuthenticator,则YYAuthenticator是构建中存在的客户特定类。所以,例如,如果我在这样的bean中有一行代码:

@Inject Authenticator authenticator;

我可以基于某些逻辑以编程方式和/或动态注入继承的类,例如登录用户具有客户特定的功能。

我所期待的是,我不想改变上面的注入线,因为它会在每个类中发生重大变化。但是期望某种动态逻辑或配置文件将核心类注入更改为客户特定的类..

最后不要触摸@Inject Authenticator身份验证器;线。我可以通过一些逻辑注入xxAuthenticator或YYAuthenticator吗?我们在项目技术堆栈中没有Spring ..所以请建议我只用春天..提前感谢

2 个答案:

答案 0 :(得分:1)

听起来你的用例更像是限定符。如果用户遵循某个特定的要求,您应该注入不同的合格版本的类,不是吗?

@Inject
private Instance<SomeService> someServiceInstance;


// later on...

SomeService someService = null;

if(someCondition) {
    someService = someServiceInstance.select(new FooLiteral()).get();
}
else {
   someService = someServiceInstance.select(new BarLiteral()).get();
}

FooLiteralBarLiteral @Foo@Bar {{1}}的哪些是限定符。

答案 1 :(得分:0)

在CDI中,这是通过"producer methods"完成的 它看起来像这样:

@ApplicationScoped
public class AuthenticatorProducer {
   private Authenticator xxAuthenticator; // = ...
   private Authenticator yyAuthenticator; // = ...

   @Produces
   public Authenticator getAuthenticator() {
        if (someCondition) {
            return xxAuthenticator;
        } else {
            return yyAuthenticator;
        }
    }
} 

无需更改注入点,并且身份验证器本身不必是CDI bean。