java – 带有实例的CDI条件Bean

我有必要在运行时提供正确的Bean实现.

通用界面:

public interface MyInterface { ... }

实施:

@Named("one")
class MyInterfaceImpl1 implements MyInterface { ... }

@Named("two")
class MyInterfaceImpl2 implements MyInterface { ... }

@Named("three")
class MyInterfaceImpl3 implements MyInterface { ... }

请注意,这些类是包私有的.

然后我写了一个@Produces方法:

@Produces
@Singleton
MyInterface getMyInterface(
        final Instance<MyInterface> myInterfaceImplementations,
        final Configuration configuration) {
    // Might be one, two or three.
    final String parameter = configuration.getString("value");
    return myInterfaceImplementations.select(new NamedLiteral(parameter)).get();
}

这是正确的方法,还是有更好的解决方案?

最佳答案 你的解决方案可以正常工作,这是我的0.02美元只是为了确保你这样做:

Nikos Paraskevopoulos在评论中的意思是你有效地创造了四个注入一个的豆子. MyInterfaceImpl1,MyInterfaceImpl2,MyInterfaceImpl3都是应用程序中任何位置注入的合法bean.如果这些豆子很重,那么创造可能需要一些时间,而且将它们注射到任何地方的能力可能并非如此?然后有你的制作人方法 – 第四个豆 – 我假设它最终是你唯一的一个.

其次,三个实现bean与producer方法的范围不同.如果他们有资格注射,在你的情况下,他们共享相同的范围似乎合乎逻辑?

第三,使用@Singleton.我也建议@ApplicationScoped,通过代理没有任何伤害和没有开销.你将无法区分并且可以轻松避免CDI单例(它不像EJB单例)的一些令人不快的意外.

点赞