TL; DR
La anotación @Autowired le ahorra la necesidad de realizar el cableado usted mismo en el archivo XML (o de cualquier otra manera) y simplemente encuentra lo que necesita inyectarse en dónde y lo hace por usted.
Explicación completa
La @Autowired
anotación le permite omitir configuraciones en otros lugares de qué inyectar y simplemente lo hace por usted. Suponiendo que su paquete com.mycompany.movies
tiene que poner esta etiqueta en su XML (archivo de contexto de la aplicación):
<context:component-scan base-package="com.mycompany.movies" />
Esta etiqueta hará un escaneo automático. Suponiendo que cada clase que tiene que convertirse en un bean se anota con una anotación correcta como @Component
(para bean simple) o @Controller
(para un control de servlet) o @Repository
(para DAO
clases) y estas clases están en algún lugar debajo del paquete com.mycompany.movies
, Spring encontrará todo esto y creará un frijol para cada uno Esto se realiza en 2 escaneos de las clases: la primera vez que solo busca clases que necesitan convertirse en un bean y mapea las inyecciones que necesita estar haciendo, y en el segundo escaneo inyecta los beans. Por supuesto, puede definir sus beans en el archivo XML más tradicional o con una clase @Configuration (o cualquier combinación de los tres).
La @Autowired
anotación le dice a Spring dónde debe ocurrir una inyección. Si lo pones en un método setMovieFinder
, entiende (por el prefijo set
+ la @Autowired
anotación) que se necesita inyectar un bean. En la segunda exploración, Spring busca un bean de tipo MovieFinder
y, si lo encuentra, lo inyecta a este método. Si encuentra dos de esos frijoles, obtendrá un Exception
. Para evitarlo Exception
, puede usar la @Qualifier
anotación y decirle cuál de los dos frijoles inyectar de la siguiente manera:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
O si prefiere declarar los beans en su XML, se vería así:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
En la @Autowired
declaración, también debe agregar el @Qualifier
para decir cuál de los dos granos de color para inyectar:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Si no desea usar dos anotaciones (la @Autowired
y @Qualifier
) puede @Resource
combinar estas dos:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
El @Resource
(puede leer algunos datos adicionales al respecto en el primer comentario de esta respuesta) le ahorra el uso de dos anotaciones y en su lugar solo usa una.
Solo agregaré dos comentarios más:
- Una buena práctica sería usarlo en
@Inject
lugar de hacerlo @Autowired
porque no es específico de Spring y es parte del JSR-330
estándar .
- Otra buena práctica sería colocar
@Inject
/ @Autowired
en un constructor en lugar de un método. Si lo pones en un constructor, puedes validar que los beans inyectados no son nulos y fallan rápidamente cuando intentas iniciar la aplicación y evitar NullPointerException
cuando necesitas usar el bean.
Actualización : para completar la imagen, creé una nueva pregunta sobre la @Configuration
clase.