java - @autowired spring ejemplo
¿Cuál es la diferencia entre @Inject y @Autowired en Spring Framework? ¿Cuál usar bajo qué condición? (10)
A partir de Spring 3.0, Spring ofrece soporte para las anotaciones de inyección de dependencia JSR-330 ( @Inject
, @Named
, @Singleton
).
Hay una sección separada en la documentación de Spring sobre ellos, que incluye comparaciones con sus equivalentes de Spring.
Estoy revisando algunos blogs en SpringSource y en uno de los blogs, el autor usa @Inject
y supongo que también puede usar @Autowired
.
Aquí está la pieza de código:
@Inject private CustomerOrderService customerOrderService;
No estoy seguro de la diferencia entre @Inject
y @Autowired
y agradecería que alguien explicara su diferencia y cuál utilizar, ¿en qué situación?
Además de lo anterior:
- El alcance predeterminado para los frijoles @Autowired es Singleton, mientras que usar la anotación JSR 330 @Inject es como el
prototype
de Spring. - No hay equivalente de @Lazy en JSR 330 usando @Inject
- No hay equivalente de @Value en JSR 330 usando @Inject
Aquí hay una publicación de blog que compara @Resource
, @Inject
y @Autowired
, y parece hacer un trabajo bastante completo.
Desde el enlace:
Con la excepción de las pruebas 2 y 7, la configuración y los resultados fueron idénticos. Cuando miré debajo del capó, determiné que la anotación ''@Autowired'' y ''@Inject'' se comportan de manera idéntica. Ambas anotaciones usan el ''AutowiredAnnotationBeanPostProcessor'' para inyectar dependencias. ''@Autowired'' y ''@Inject'' pueden usarse intercambiables para inyectar judías Spring. Sin embargo, la anotación ''@Resource'' usa el ''CommonAnnotationBeanPostProcessor'' para inyectar dependencias. A pesar de que usan diferentes clases de post-procesadores, todos se comportan de manera casi idéntica. A continuación se muestra un resumen de sus caminos de ejecución.
Las pruebas 2 y 7 a las que hace referencia el autor son "inyección por nombre de campo" y "un intento de resolver un bean con un calificador defectuoso", respectivamente.
La conclusión debe darle toda la información que necesita.
La anotación @Inject
es una de las recopilaciones de anotaciones JSR-330. Esto tiene las rutas de ejecución de Coincidencia por tipo, Coincidencia por calificador, Coincidencia por nombre. Estas rutas de ejecución son válidas tanto para el establecimiento como para la inyección de campo. El comportamiento de la anotación @Autowired
es el mismo que la anotación @Inject
. La única diferencia es que la anotación @Autowired
es parte del framework Spring. @Autowired
anotación también tiene las rutas de ejecución anteriores. Así que recomiendo el @Autowired
para su respuesta.
La diferencia clave (notada al leer Spring Docs ) entre @Autowired
y @Inject
es que @Autowired
tiene el atributo ''obligatorio'' mientras que @Inject no tiene ningún atributo ''obligatorio''.
Mejor uso @Inject todo el tiempo. Debido a que es el enfoque de configuración java (proporcionado por sun) lo que hace que nuestra aplicación sea independiente del marco. Así que si tu primavera también tus clases funcionarán.
Si usa @Autowired, solo funcionará con spring porque @Autowired es una anotación proporcionada por spring.
Para manejar la situación en la que no hay cableado, los beans están disponibles con el @Autowired
required
@Autowired
establecido en false
.
Pero cuando se utiliza @Inject
, la interfaz del proveedor funciona con el bean, lo que significa que el bean no se inyecta directamente sino con el proveedor.
Suponiendo que aquí te refieres a las anotaciones javax.inject.Inject
. @Inject
es parte del estándar Java CDI ( Contexts and Dependency Injection ) introducido en Java EE 6 (JSR-299), lea más . Spring ha optado por admitir el uso de @Inject
sinónimo de su propia anotación @Autowired
.
Entonces, para responder a su pregunta, @Autowired
es la propia anotación (heredada) de Spring. @Inject
es parte de una nueva tecnología Java llamada CDI que define un estándar para la inyección de dependencias similar a Spring. En una aplicación de Spring, las dos anotaciones funcionan de la misma manera que Spring ha decidido admitir algunas anotaciones JSR-299 además de las propias.
@Autowired
anotación @Autowired
se define en el framework Spring.
@Inject
anotación @Inject
es una anotación estándar, que se define en el estándar "Inyección de dependencia para Java" (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 Picocontainer también son compatibles con este modelo).
Con @Inject
se puede inyectar la referencia a la implementación de la interfaz del Provider
, que permite inyectar las referencias diferidas.
Anotaciones @Inject
y @Autowired
- son analogías casi completas. Además de la anotación @Autowired
, la anotación @Inject
se puede utilizar para propiedades, métodos y constructores de enlace automático.
A diferencia de la anotación @Autowired
, la anotación @Inject
no tiene ningún atributo required
. Por lo tanto, si no se encontrarán las dependencias, se lanzará una excepción.
También hay diferencias en las aclaraciones de las propiedades de unión. Si existe ambigüedad en la elección de los componentes para la inyección, se debe agregar el calificador @Named
. En una situación similar para @Autowired
se @Autowired
anotación @Qualifier
qualifier (JSR-330 define su propia anotación @Qualifier
y, a través de esta calificación, se define @Named
).
@Inject
no tiene atributo ''requerido''