La anotación Spring Component se utiliza para indicar una clase como componente. Significa que Spring detectará automáticamente estas clases para la inyección de dependencia cuando se utilice la configuración basada en anotaciones y el escaneo de classpath.
Vídeo Explicativo
Tipos de @Component
Spring proporciona algunas anotaciones especializadas: @Controller, @Service y @Repository. Todos proporcionan la misma función que @Component.
Todos actúan igual porque todos son anotaciones compuestas con @Component como meta-anotación para cada uno de ellos. Son como alias de @Component que se usan para identificar nuestras clases en nuestro proyecto y no tienen ninguna influencia con el Framework Spring. Es decir, podríamos usar siempre @Component en todas nuestras clases aunque es conveniente usar cada una en sus respectivas clases:
- @Service: indica que la clase proporciona algunos servicios. Nuestras clases de utilidad se pueden marcar como clases de servicio.
- @Repository: esta anotación indica que la clase trata con operaciones CRUD, generalmente se usa con implementaciones DAO que tratan con tablas de bases de datos.
- @Controller: se usa principalmente con aplicaciones web o servicios web REST para especificar que la clase es un controlador frontal y responsable de manejar la solicitud del usuario y devolver la respuesta adecuada
@Controller
public class UsuarioControlador {
}
@Service
public class UsuarioServicio {
}
@Repository
public class UsuarioRepositorio {
}
@Component
public class AppConfig {
}
@Component limitaciones
Hay algunos escenarios en los que queremos que un determinado objeto se convierta en un bean administrado por Spring cuando no podemos usar @Component.
@Component fuera de nuestro proyecto
Cuando definimos una clase anotada con @Component en un paquete fuera de nuestro proyecto, Spring no será capaz de detectar nuestra clase y esta no será guardada dentro del ApplicationContext de Spring:
package com.programandoenjava.component.fuera;
@Component
public class ClaseFuera {
}
@Component en un paquete de terceros
Es posible que no tengamos acceso al código fuente porque proviene de una fuente de terceros y no podemos agregar la anotación @Component. O tal vez queramos usar condicionalmente una implementación de bean sobre otra según el entorno en el que nos estemos ejecutando. La detección automática es suficiente la mayor parte del tiempo, pero cuando no lo es, podemos usar @Bean.
package com.paqueteexterno.component;
public class ClaseDeTercero {
}
Al ser una clase dentro de una librería externa no podremos modificar el código y por tanto usar @Component dentro de la clase.
Usando ApplicationContext
Una forma de obtener nuestras instancias que Spring ha creado y guardado dentro de su ApplicationContext es a través de su método getBean:
@Component
public class AppConfig {
// Inyectamos ApplicationContext
public AppConfig(ApplicationContext applicationContext) {
UsuarioServicio usuarioServicio = applicationContext.getBean(UsuarioServicio.class);
usuarioServicio.nuestroMetodo();
}
}
Ver todos los @Component
Hay veces que es importante ver que @Component están siendo guardados en Spring, con este ejemplo veremos que instancias tiene Spring en su ApplicationContext:
@Component
public class AppConfig {
public AppConfig(ApplicationContext applicationContext) {
String[] allBeanNames = applicationContext.getBeanDefinitionNames();
for(String beanName : allBeanNames) {
System.out.println(beanName);
}
}
}