Primavera: @Component versus @Bean
Entiendo que @Component
la anotación se introdujo Spring 2.5
para eliminar la definición del bean XML mediante el escaneo de classpath.
@Bean
se introdujo en la primavera 3.0 y se puede usar @Configuration
para deshacerse completamente del archivo XML y usar la configuración de Java en su lugar.
¿ Habría sido posible reutilizar la @Component
anotación en lugar de introducirla @Bean
? Tengo entendido que el objetivo final es crear beans en ambos casos.
@Component Preferible para escaneo de componentes y cableado automático.
¿ Cuándo deberías usar @Bean ?
A veces la configuración automática no es una opción. ¿Cuando? Imaginemos que desea conectar componentes de bibliotecas de terceros (no tiene el código fuente, por lo que no puede anotar sus clases con @Component), por lo que la configuración automática no es posible.
La anotación @Bean devuelve un objeto que Spring debe registrar como bean en el contexto de la aplicación. El cuerpo del método contiene la lógica responsable de crear la instancia.
@Component
y @Bean
hacer dos cosas bastante diferentes, y no deben confundirse.
@Component
(y @Service
y @Repository
) se utilizan para detectar y configurar automáticamente beans mediante el escaneo de classpath. Hay un mapeo implícito uno a uno entre la clase anotada y el bean (es decir, un bean por clase). El control del cableado es bastante limitado con este enfoque, ya que es puramente declarativo.
@Bean
se usa para declarar explícitamente un solo bean, en lugar de dejar que Spring lo haga automáticamente como se indicó anteriormente. Desacopla la declaración del bean de la definición de clase y le permite crear y configurar beans exactamente como usted elija.
Para responder tu pregunta...
¿ Habría sido posible reutilizar la
@Component
anotación en lugar de introducirla@Bean
?
Seguro, probablemente; pero decidieron no hacerlo, ya que los dos son bastante diferentes. La primavera ya es bastante confusa como para enturbiar aún más las aguas.
- @Component detecta y configura automáticamente los beans mediante el escaneo de classpath, mientras que @Bean declara explícitamente un solo bean, en lugar de dejar que Spring lo haga automáticamente.
- @Component no desacopla la declaración del bean de la definición de clase, mientras que @Bean desacopla la declaración del bean de la definición de clase.
- @Component es una anotación a nivel de clase , mientras que @Bean es una anotación a nivel de método y el nombre del método sirve como nombre del bean.
- No es necesario usar @Component con la anotación @Configuration, mientras que la anotación @Bean debe usarse dentro de la clase que está anotada con @Configuration .
- No podemos crear un bean de una clase usando @Component, si la clase está fuera del contenedor Spring, mientras que podemos crear un bean de una clase usando @Bean incluso si la clase está presente fuera del contenedor Spring .
- @Component tiene diferentes especializaciones como @Controller, @Repository y @Service, mientras que @Bean no tiene ninguna especialización .