我有必要在运行时提供正确的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单例)的一些令人不快的意外.