2010-06-15 7 views
18

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, CDI parece confiar más en la magia que en el acceso programático a las vinculaciones de sest. ¿Estoy equivocado o cómo se puede lograr el mismo efecto con WELD?¿Hay un equivalente en CDI (WELD) para construir definiciones (como se hace en los módulos de Guice) y luego crea un inyector?

Cualquier ejemplo de código sería apreciada ...

CLARIFICACION

Tenía la esperanza de construir un módulo (término Guice lo siento insegura del término CDI) mediante programación, utilizando el estilo Builder dada por Guice en http://code.google.com/p/google-guice/.

Estoy construyendo un sistema dinámico y necesito enlazar tipos (como interfaces), constantes, etc. en lugar de simplemente soldar Digitalizar dinámicamente la ruta de clases, etc., y buscar y registrar tipos. Creo que CDI es estático, el paquete javax.inject no incluye ninguna interfaz que permita vincular los tipos de forma programática a las implementaciones.

CLARIFICACION PARTE 2

La premisa básica de la pregunta original era la simple observación de que las anotaciones se cuecen al horno y las reglas definidas en ellos para ayudar a la inejctor no se pueden cambiar. Originalmente quería acceso público a las mismas interfaces que usa el escáner CDI classpath para construir definiciones para su uso interno. Básicamente, lo que quiero decir 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 quiere alguna otra estrategia, entonces existe la posibilidad de hacerlo.

Un problema con el enfoque actual es la limitación de que uno no puede reutilizar componentes (clases) con anotaciones diferentes para seleccionar colaboradores diferentes. Antes de saltar, permítanme calificar esta afirmación, sí, se puede hacer con proveedores y demás, pero esto lleva a más artefactos. Debería haber una manera más simple.

Ejemplo 1

Lo siento si este ejemplo es pobre, mi caso de uso es mucho más complicado y el detalle sería ponerse en el camino y hacer una lectura mucho más tiempo.

Imagínese uno tiene un componente de reescritura de URL que por bien de los argumentos tiene algunos parámetros como

  • reemplazar este patrón con ese patrón.
  • quizá un limpiador html

Si desea inyectar este mismo componente con dos reglas diferentes, pero tienen reemplazar el inyector limpiador html, su pegada. Claro que hay formas de evitar esto, pero requieren artefactos que, por supuesto, es más código.

Desafortunadamente, todas las reglas de encuadernación están en la clase y no en la instancia, por lo que cada vez que solicite una clase obtendrá una instancia prácticamente equivalente de manera equivalente.

SOLDADURA

Esta pregunta fue escrito hace un whiel, he renunciado a Weld.I creen que la forma en que se dicta cómo se realiza su magia está mal. No me gusta el hecho de que me dicten cómo sucede esto sin proporcionarme una forma de controlar cuándo o cómo puedo repetir esta acción.No me gusta esta inflexibilidad.

+3

¿Cambiar a Guice? –

+0

Bueno, esperaba usar un "estándar" al que Guice y Spring avanzaran. Dadas las diferencias entre los 3 grandes, aparece mientras que CDI puede ser un estándar, es algo incompleto e ignorado ya que WELD tiene muchos extras y mientras Guice y Spring comparten algunas anotaciones, funcionan de manera diferente y usan class/intf no estándar. –

+2

@mP podría explicar (con ejemplos) el efecto deseado, porque no sé guice – Bozho

Respuesta

6

Utilizo Guice y CDI/Seam2 de forma regular. La respuesta corta es no, CDI no admite la definición de bean programática ('binding', como lo llama Guice).

CDI utiliza un enfoque declarativo donde el contenedor escaneará automáticamente las definiciones de bean. 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 básicamente se puede hacer cualquier cosa).


Mis dos centavos

que utilizo ambos marcos: Guice para "nivel inferior" componentes POJO no son de empresa (en la que no tengo necesidad características/CDI), CDI para cualquier cosa en la que necesita 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. A medida que me familiarizo con CDI, estoy encontrando menos necesidad de Guice. Me imagino que cuando CDI admite instancias 'no administradas', puedo reemplazar Guice con CDI (por ejemplo, weld-se).

RE: Weld 'magic': IMO nada es 'mágico' sobre el escaneo de definición de frijol. Está muy bien definido en la especificación CDI, y es similar a otros frameworks Java Enterprise tales como JPA y EJB3.

Mi consejo es que usted es:

  1. Usar lo que funciona para usted. Si no te gusta el CDI, no lo uses. Por ejemplo, necesito 'instancias no administradas' en mi aplicación, entonces uso Guice para eso.
  2. Si cree que el CDI podría ser mejor (lo hago), involúcrese - participe en la comunidad que define el CDI.
+0

Gracias Josh, mis comentarios sobre magia se refieren a la incapacidad de cambiar el comportamiento, cómo o cuándo sucede. No se puede invocar ningún método para iniciar, detener, actualizar, etc. –

+0

No hay problema. Guice y CDI tienen objetivos de diseño muy diferentes. CDI está orientado a soportar JSF, mientras que usted tendría que hacer todo eso usted mismo con Guice. La definición de bean programática suena bien, pero en la práctica creo que es una fuente de confusión/error. –

Cuestiones relacionadas