guice - google - dagger inject
¿Existe un equivalente en CDI(WELD) para crear definiciones(como se hace en los módulos de Guice) y luego crear un inyector? (1)
Uso Guice y CDI / Seam2 de forma regular. La respuesta corta es no , CDI no admite la definición de bean programático ("vinculante", como lo llama Guice).
CDI utiliza un enfoque declarativo donde el contenedor buscará automáticamente las definiciones de los beans. Esto se puede personalizar hasta cierto punto con las características de ''alternativas'', pero no es tan flexible como el enfoque programático de Guice (donde puede hacer prácticamente cualquier cosa).
Mis dos centavos
Uso ambos marcos: Guice para componentes POJO no empresariales de "nivel inferior" (donde no tengo / necesito funciones de CDI), CDI para cualquier cosa donde necesito las características adicionales de CDI, cosas que están conectadas a JSF o EJB3. Principalmente comencé a usar Guice como una forma de obtener DI en las JVM ''adaptadoras'', que se ejecutan fuera del clúster del servidor de aplicaciones. Sin embargo, a medida que me familiarizo con el CDI, no creo que Guice necesite menos. Me imagino que cuando CDI admite instancias "no gestionadas" es posible que pueda reemplazar Guice con CDI (por ejemplo, soldadura-se).
RE: Weld ''magic'' - IMO nada es ''magic'' acerca del escaneo de definición de bean. Está realmente bien definido en la especificación de CDI, y es similar a otros marcos de Java Enterprise como JPA y EJB3.
Mi consejo es para ti es:
- Usa lo que funcione para ti . Si no te gusta el CDI, no lo uses. Por ejemplo, necesito ''instancias no gestionadas'' en mi aplicación, así que uso Guice para eso.
- Si crees que CDI podría ser mejor (yo lo hago), participa : participa en la comunidad que define a CDI.
Me gusta la forma en que Guice hace que sea bastante sencillo crear manualmente sus propios módulos, cada uno con sus propios enlaces hechos en código. Por otro lado, el CDI parece depender más de la magia que del acceso programático a los enlaces sest. ¿Me equivoco o cómo se puede lograr el mismo efecto con WELD?
Cualquier ejemplo de código sería apreciado ...
ACLARACIÓN
Esperaba construir un Módulo (el término de Guice lo siento, no estoy seguro del término de CDI) programáticamente, usando el estilo de patrón de construcción que me dio Guice en http://code.google.com/p/google-guice/ .
Estoy construyendo un sistema dinámico y tengo la necesidad de poder unir tipos (como interfaces), constantes, etc., en lugar de simplemente tener que Soldar escanear dinámicamente el classpath, etc., y buscar y registrar tipos. Creo que CDI es estático, el paquete javax.inject no incluye ninguna interfaz que le permita a uno enlazar tipos a implementaciones mediante programación.
CLARIFICACIÓN PARTE 2
La premisa básica de la pregunta original era la simple observación de que las anotaciones están integradas y las reglas definidas en ellas para ayudar al inejctor no se pueden cambiar. Originalmente quería acceso público a las mismas interfaces que utiliza el escáner de ruta de clase CDI para crear definiciones para su uso interno. Básicamente, lo que digo es que quiero una capa que me permita leer las anotaciones y crear las definiciones para el contenedor. Un proveedor predeterminado podría ser uno que haga lo que sucede ahora, pero si desea alguna otra estrategia, existe la posibilidad de hacerlo.
Un problema con el enfoque actual es la limitación de que no se pueden reutilizar componentes (clases) con diferentes anotaciones para seleccionar diferentes colaboradores. Antes de que salte, permítame calificar esta declaración, sí, se puede hacer con los proveedores y demás, pero esto conduce a más artefactos. Debería haber una forma más sencilla.
Ejemplo 1
Lo siento si este ejemplo es deficiente, mi caso de uso es mucho más complicado y los detalles se interpondrían y permitirían una lectura mucho más larga.
Imagina que uno tiene un componente de reescritura de URL que, por razones, tiene algunos parámetros como
- Reemplace este patrón con ese patrón.
- tal vez un limpiador html
Si desea inyectar este mismo componente con dos reglas de reemplazo diferentes pero tiene el inyector de limpiador html, se atasca. Claro que hay maneras de evitar esto, pero requieren artefactos que, por supuesto, son más códigos.
Desafortunadamente, todas las reglas vinculantes están en la clase y no en la instancia, por lo tanto, cada vez que solicite una clase, obtendrá una instancia casi funcionalmente equivalente.
SOLDAR
Esta pregunta fue escrita hace mucho tiempo, he renunciado a Weld. Creo que la forma en que dicta cómo se hace su magia es incorrecta. No me gusta el hecho de que me dicten cómo sucede esto sin proporcionarme una manera de controlar cuándo o cómo me gustaría repetir esta acción. No me gusta esta inflexibilidad.