Estoy revisando algunos blogs en SpringSource y en uno de los blogs, el autor está usando @Inject
y supongo que él también puede usar @Autowired
.
Aquí está el fragmento de código:
@Inject private CustomerOrderService customerOrderService;
No estoy seguro de la diferencia entre @Inject
y @Autowired
agradecería si alguien explicara su diferencia y cuál usar en qué situación.
Respuestas:
Suponiendo que aquí te refieres a las
javax.inject.Inject
anotaciones.@Inject
forma parte del estándar Java CDI ( Contexts and Dependency Injection ) introducido en Java EE 6 (JSR-299), lea más . Spring ha optado por apoyar el uso como@Inject
sinónimo de su propia@Autowired
anotación.Entonces, para responder a su pregunta,
@Autowired
es la propia anotación de Spring.@Inject
es parte de una nueva tecnología Java llamada CDI que define un estándar para la inyección de dependencia similar a Spring. En una aplicación Spring, las dos anotaciones funcionan de la misma manera que Spring ha decidido admitir algunas anotaciones JSR-299 además de las suyas.fuente
@Inject
es un JSR (JSR-330) separado del CDI (JSR-299).@Inject
anotación JSR, es mejor que usar lo@Autowired
que bloquea su base de código con Spring DI.@Inject
solo no garantizará la independencia del marco. También necesitaría declarar frijoles inyectables sin mecanismos dependientes del marco como Spring's@Component
oapplication.xml
, pero usar@Named
y@Singleton
a nivel de clase. No tengo idea si algún proyecto de Spring realmente declara frijoles así hoy, incluso nunca escuché de ningún proyecto que migró de Spring a JEE ...Aquí está una entrada de blog que compara
@Resource
,@Inject
y@Autowired
, y parece hacer un trabajo bastante completa.Desde el enlace:
Las pruebas 2 y 7 indican que las referencias del autor son 'inyección por nombre de campo' y 'un intento de resolver un bean utilizando un calificador incorrecto', respectivamente.
La conclusión debería darle toda la información que necesita.
fuente
Para manejar la situación en la que no hay cableado, los beans están disponibles con el
@Autowired
required
atributo establecido enfalse
.Pero cuando se usa
@Inject
, la interfaz del proveedor funciona con el bean, lo que significa que el bean no se inyecta directamente sino con el proveedor.fuente
A partir de la primavera 3.0, Spring ofrece soporte para JSR-330 anotaciones de inyección de dependencia (
@Inject
,@Named
,@Singleton
).Hay una sección separada en la documentación de Spring sobre ellos, que incluye comparaciones con sus equivalentes de Spring.
fuente
La diferencia clave (notada al leer Spring Docs ) entre
@Autowired
y@Inject
es que@Autowired
tiene el atributo 'requerido' mientras que @Inject no tiene el atributo 'requerido'.fuente
@Autowired(required=false)
términos simples, "elrequired
atributo indica que la propiedad no es necesaria para fines de cableado automático, la propiedad se ignora si no se puede cablear automáticamente".Mejor use @Inject todo el tiempo. Debido a que es el enfoque de configuración de Java (proporcionado por Sun) lo que hace que nuestra aplicación sea independiente del marco. Así que si saltas también tus clases funcionarán.
Si usa @Autowired, solo funcionará con spring porque @Autowired es una anotación proporcionada por spring.
fuente
@Autowired
La anotación se define en el marco de Spring.@Inject
La anotación es una anotación estándar, que se define en la "Inyección de dependencia para Java" estándar (JSR-330) . Spring (desde la versión 3.0) admite el modelo generalizado de inyección de dependencia que se define en el estándar JSR-330. (Los marcos de Google Guice y el marco de Picocontainer también admiten este modelo).Con
@Inject
se puede inyectar la referencia a la implementación de laProvider
interfaz, lo que permite inyectar las referencias diferidas.Anotaciones
@Inject
y@Autowired
- es analogías casi completas. Además de la@Autowired
anotación, la@Inject
anotación se puede usar para propiedades de enlace automático, métodos y constructores.A diferencia de la
@Autowired
anotación, la@Inject
anotación no tienerequired
atributo. Por lo tanto, si no se encuentran las dependencias, se generará una excepción.También hay diferencias en las aclaraciones de las propiedades de unión. Si hay ambigüedad en la elección de los componentes para la inyección,
@Named
se debe agregar el calificador. En una situación similar para la@Autowired
anotación se agregará el@Qualifier
calificador (JSR-330 define su propia@Qualifier
anotación y, a través de este calificador,@Named
se define la anotación ).fuente
@Inject
no tiene atributo 'requerido'fuente
Además de lo anterior:
@Autowired
beans es Singleton, mientras que el uso de la@Inject
anotación JSR 330 es como el prototipo de Spring .@Inject
.@Inject
.fuente
La
@Inject
anotación es una de la colección de anotaciones JSR-330. Esto tiene rutas de ejecución Match by Type, Match by Qualifier, Match by Name. Estas rutas de ejecución son válidas tanto para el setter como para la inyección de campo. El comportamiento de la@Autowired
anotación es el mismo que la@Inject
anotación. La única diferencia es que la@Autowired
anotación es parte del marco Spring.@Autowired
La anotación también tiene las rutas de ejecución anteriores. Así que recomiendo el@Autowired
para su respuesta.fuente