2012-03-11 20 views

Respuesta

9

En realidad, ambos son malos. Ambos vinculan su aplicación al marco Spring, invirtiendo así todo el concepto de inversión de control. En un mundo ideal, su aplicación no debe ser consciente de ser administrada por un ApplicationContext en absoluto.

Una vez que haya decidido violar este principio, en realidad no importa cómo lo haga. ApplicationContextAware es la versión heredada que ha estado alrededor de at least since Version 2.0. @Autowired es un mecanismo más nuevo, pero funcionan de la misma manera. Probablemente vaya con ApplicationContextAware, ya que semánticamente aclara de qué se trata.

+0

Thanks. Pero, ¿y si el bean, which applicationContext se está inyectando en él, ya es un bean de primavera? ¿Crees que todavía es una violación? Por cierto, en realidad, la mayoría de los frijoles que tengo son un grano de primavera en mi aplicación, es por eso que estoy un poco confundido acerca de su mención: 'ate su aplicación al marco de Spring'. ¿Es correcto en todos los casos o en el caso solo si tengo una aplicación que está parcialmente separada del marco de primavera y uso la primavera solo para algunos granos para lograr algunas funcionalidades? – Javatar

+0

Eso depende de lo que usted llama un Spring Bean. Si tiene Java Beans simples administrados por Spring desde el exterior, su aplicación no está vinculada a Spring y probablemente le tomará menos de un día cambiar a un contenedor IOC diferente. Ese es un extremo (que, como es lógico, difícilmente encontrarás), el otro extremo es lo que estás describiendo: inyección de dependencia a través del Localizador de Servicios, o como yo lo llamo: Inversión de Inversión de Control. Solo intenta hacer eso solo cuando de verdad lo necesites. –

+0

El principal motivo de mi pregunta es la inyección de un prototipo de frijol en un frijol con mira simple. Es por eso que debo obtener el bean de applicationContext (o BeanFactory) para cada método de llamada. Por cierto, cada clase en mi paquete raíz (significa todas las clases) está bajo el control de primavera. Entonces, la última pregunta, ¿puedes explicar más en detalle de lo que mencionas: "semánticamente deja en claro de qué se trata"? Muchas gracias de antemano otra vez. – Javatar

0

Dado que usted es sin extender ninguna de las clases de muelles, su aplicación siempre está separada del marco. En la mayoría de los casos, no querrá inyectar el ApplicationContext, pero tendrá que inyectar los beans definidos en el ApplicationContext.

El mejor caso es siempre apegarse al mínimo indispensable, hasta ya menos que tenga un requisito específico y esto es muy simple con la primavera.

Así que, o,

  1. anotar sus frijoles y scan en application context, a continuación, utilizar @Autowire cablear hacia arriba.

  2. Utilice application context para cablear sus conveniencias de frijol (antiguas configuraciones de estilo xml). Puede usar @Autowire con este enfoque también.

Cuando se desea controlar el ciclo de vida de frijol, se puede leer la API y personalizarlo, pero la mayoría de las veces estos ajustes generales va a hacer el trabajo.

Aquí hay algunos ejemplos.

  1. Spring Auto-Wiring Beans with @Autowired annotation
  2. Spring Auto-Wiring Beans XML Style
  3. Spring IoC container API Docs
+0

Gracias por su comentario, pero tengo suficiente conocimiento sobre la primavera en términos de casos comunes y de autoenvío :) La principal razón para que mi pregunta sea relevante es la capacidad de inyectar un prototipo de frijol con alcance en un frijol con mira simple. En ese caso, solo la inyección normal de frijol no funciona como se esperaba, por lo que debería obtener frijol de applicationContext (o mejor BeanFactory) para cada método de llamada. – Javatar

+0

"Como no está extendiendo ninguna de las clases de muelles, su aplicación siempre está separada de la estructura". Esto no es verdad. Solo al inyectar ApplicationContext se vincula la aplicación a Spring. No compilará si Spring no está presente –

2

Como dice @Sean Patrick Floyd, la necesidad de Application Context es a menudo debido a un mal diseño. Pero a veces no tienes otra opción. En esos casos, prefiero el uso de @Autowired porque es la forma en que inserto todas las demás propiedades. Entonces, si uso @Autowired para inyectar MyRepository, ¿por qué no puedo usarlo para ApplicationContext o cualquier otro Spring Bean?

Uso las interfaces de Spring solo para aquellas cosas que no puedo hacer con las anotaciones, por ejemplo BeanNameAware.

2

Si necesita obtener un prototipo en un singleton, puede usar el método de inyección. Básicamente, creas un método abstracto que devuelve el objeto que necesitas y Spring devuelve el prototipo cada vez que llamas a ese método. Usted define el "método de búsqueda" en su configuración de primavera.Aquí hay algunos enlaces: http://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-injection-spring

Cuestiones relacionadas