Tengo la necesidad de proporcionar a la aplicación correcta de la haba en tiempo de ejecución.
La interfaz común:
public interface MyInterface { ... }
Las implementaciones:
@Named("one")
class MyInterfaceImpl1 implements MyInterface { ... }
@Named("two")
class MyInterfaceImpl2 implements MyInterface { ... }
@Named("three")
class MyInterfaceImpl3 implements MyInterface { ... }
Tenga en cuenta estas clases son paquete-privada.
Entonces escribí un @Produces
método:
@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();
}
Es esta la manera correcta de ir, o hay una solución mejor?
Su solución funcionaría bien, aquí están mis $ 0,02 sólo para asegurarse de que lo encaminó de esa manera:
Lo Nikos Paraskevopoulos significaba en su comentario es que su eficacia están creando cuatro granos para inyectar una. MyInterfaceImpl1
, MyInterfaceImpl2
, MyInterfaceImpl3
Son todos los granos legítimas para cualquier lugar de la inyección en la aplicación. Si estos granos son pesados, la creación puede tomar algún tiempo, también la capacidad de inyectar en cualquier lugar no podría ser previsto? Y luego está el método del productor - el cuarto de frijoles - que supongo que es en última instancia, el único que está después.
En segundo lugar, los tres granos de aplicación tienen un alcance diferente del método de productor. Si son elegibles para la inyección, en su caso, parece lógico que comparten mismo alcance, tal vez?
En tercer lugar, el uso @Singleton
. Lo haría también consejo para @ApplicationScoped
, no hay ningún daño y ninguna sobrecarga por tener un proxy. Usted no será capaz de notar la diferencia y puede evitar sorpresas desagradables con CDI Singleton (que no se comporta como Singleton EJB).