Repaso
English
Spring, JPA y Java WebIntermedioSPR-12

¿Cuál es la diferencia entre @Component y @Bean?

Opciones

  1. No hay diferencia; ambos registran un bean de la misma forma
  2. @Component escanea tu clase; @Bean usa el resultado de un método (Opción correcta)
  3. @Bean es solo para tests, no para código de producción
  4. @Component solo se puede poner en interfaces, no en clases

Respuesta

@Component va en una clase tuya y se encuentra por escaneo; @Bean va en un método dentro de una clase @Configuration y registra el objeto devuelto, útil para clases de terceros

Por qué

@Component (y sus stereotypes) anota tu propia clase, y Spring la descubre por component scanning.

@Bean se coloca en un método de una clase @Configuration. El objeto devuelto se registra como bean. Úsalo cuando no puedes anotar la clase (una clase de librería como ObjectMapper o RestClient) o cuando la construcción necesita lógica propia.

@Configuration
public class AppConfig {
    @Bean
    public Clock clock() {
        return Clock.systemUTC();
    }
}

Recuerda

@Component = mi clase. @Bean = un método factory para cualquier clase.

Términos clave

Practica esta pregunta en Repaso