Entiendo que la @Component
anotación se introdujo en la primavera 2.5 para deshacerse de 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 por completo 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 introducir la @Bean
anotación? Tengo entendido que el objetivo final es crear frijoles en ambos casos.
java
spring
annotations
autowired
usuario1396576
fuente
fuente
@Component
,@Repository
y@Service
las anotaciones en la primavera?Lite mode
. Y no es recomendable. Ver aquí: docs.spring.io/spring/docs/current/spring-framework-reference/…@bean
devuelve una instancia personalizable de Spring Bean, mientras@component
define una clase que puede ser instanciada posteriormente por Spring IoC Engine cuando sea necesario.Respuestas:
@Component
y@Bean
hacer dos cosas muy diferentes, y no debe confundirse.@Component
(y@Service
, y@Repository
) se utilizan para detectar automáticamente y frijoles de auto-configurar mediante el escaneo ruta de clase. Hay una asignación implícita 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 lo elija.Para responder tu pregunta...
Claro, probablemente; pero decidieron no hacerlo, ya que los dos son bastante diferentes. La primavera ya es bastante confusa sin enturbiar aún más las aguas.
fuente
@Component
cuando se necesita cableado automático? Parece@Bean
que no puede afectar@Autowired
@Autowired
con@Bean
si ha anotado su clase bean con@Configuration
@Componente 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 no es posible la configuración automática.
La anotación @Bean devuelve un objeto que spring debería registrar como bean en el contexto de la aplicación. El cuerpo del método lleva la lógica responsable de crear la instancia.
fuente
@Component
va a clases en sí mismo mientras@Bean
va a métodos de clase (que producen instancias de objetos de clase)Consideremos que quiero una implementación específica dependiendo de algún estado dinámico.
@Bean
Es perfecto para ese caso.Sin embargo, no hay forma de hacerlo
@Component
.fuente
@Configuration
fuente
Ambos enfoques tienen como objetivo registrar el tipo de destino en el contenedor Spring.
La diferencia es que
@Bean
es aplicable a los métodos , mientras que@Component
es aplicable a los tipos .Por lo tanto, cuando usa
@Bean
anotaciones, controla la lógica de creación de instancias en el cuerpo del método (vea el ejemplo anterior ). Con@Component
anotaciones no puedes.fuente
Veo muchas respuestas y casi en todas partes se menciona que @Component es para el cableado automático donde se escanea el componente y @Bean declara exactamente que el bean se usará de manera diferente. Déjame mostrarte cómo es diferente.
Primero es una anotación de nivel de método. Segundo, generalmente se usa para configurar beans en un código java (si no está usando la configuración xml) y luego se llama desde una clase usando el método getBean de ApplicationContext. me gusta
Es una forma general de anotar un bean y no un bean especializado. Una anotación de nivel de clase y se utiliza para evitar todas esas cosas de configuración a través de la configuración de Java o XML.
Tenemos algo como esto.
Eso es . Se acaba de presentar para evitar todos los pasos de configuración para crear instancias y usar ese bean.
fuente
@Bean
enfoque. Todavía puede usar@Autowire
para obtener el bean como lo haría en caso de@Component
.@Bean
simplemente agrega el Bean al Spring Container tal como lo haría@Component
. La diferencia es la siguiente. 1. Utilizando@Bean
, puede agregar clases de terceros a Spring Container. 2. Usando@Bean
, puede obtener la implementación deseada de una interfaz en tiempo de ejecución (Usando el patrón de diseño de fábrica)Puede utilizar
@Bean
para hacer que una clase de terceros existente esté disponible para su contexto de aplicación Spring Framework.Al usar la
@Bean
anotación, puede ajustar una clase de terceros (puede que no tenga@Component
y puede que no use Spring), como un bean Spring. Y luego, una vez que se ajusta usando@Bean
, es como un objeto único y está disponible en el contexto de la aplicación Spring Framework. Ahora puede compartir / reutilizar fácilmente este bean en su aplicación utilizando inyección de dependencia y@Autowired
.Así que piense en la
@Bean
anotación es un contenedor / adaptador para clases de terceros. Desea que las clases de terceros estén disponibles para el contexto de la aplicación Spring Framework.Al usar
@Bean
el código anterior, declaro explícitamente un solo bean porque dentro del método, estoy creando explícitamente el objeto usando lanew
palabra clave. También estoy llamando manualmente a los métodos setter de la clase dada. Entonces puedo cambiar el valor del campo de prefijo. Por lo tanto, este trabajo manual se denomina creación explícita. Si uso el@Component
para la misma clase, el bean registrado en el contenedor Spring tendrá un valor predeterminado para el campo de prefijo.Por otro lado, cuando anotamos una clase con
@Component
, no es necesario que usemos lanew
palabra clave manualmente . Se maneja automáticamente por Spring.fuente
Cuando usa la
@Component
etiqueta, es lo mismo que tener un POJO (Objeto Java antiguo simple) con un método de declaración de vainilla (anotado con@Bean
). Por ejemplo, los siguientes métodos 1 y 2 darán el mismo resultado.Método 1
con un bean para 'theNumber':
Método 2
con los frijoles para ambos:
El método 2 le permite mantener juntas las declaraciones de frijol, es un poco más flexible, etc. Incluso puede agregar otro frijol SomeClass que no sea vainilla como el siguiente:
fuente
Tienes dos formas de generar frijoles. Una es crear una clase con una anotación
@Component
. El otro es crear un método y anotarlo con@Bean
. Para aquellas clases que contienen método con, se@Bean
deben anotar con@Configuration
Una vez que ejecute su proyecto de primavera, la clase con una@ComponentScan
anotación escaneará cada clase con@Component
ella y restaurará la instancia de esta clase en el Contenedor Ioc. Otra cosa@ComponentScan
que haría sería ejecutar los métodos con@Bean
él y restaurar el objeto de retorno al Contenedor Ioc como un bean. Entonces, cuando necesite decidir qué tipo de beans desea crear dependiendo de los estados actuales, debe usar@Bean
. Puede escribir la lógica y devolver el objeto que desee. Otra cosa que vale la pena mencionar es que el nombre del método@Bean
es el nombre predeterminado de bean.fuente
fuente
@Bean fue creado para evitar el acoplamiento de Spring y sus reglas de negocio en tiempo de compilación. Significa que puede reutilizar las reglas de su negocio en otros marcos como PlayFramework o JEE.
Además, tiene un control total sobre cómo crear beans, donde no es suficiente la instancia predeterminada de Spring.
Escribí una publicación hablando de eso.
https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/
fuente
Diferencia entre frijol y componente:
fuente
1. Acerca de @Component
@Component funciona de manera similar a @Configuration.
Ambos indican que la clase anotada tiene uno o más beans que deben registrarse
Spring-IOC-Container
.La clase anotada por @Component, la llamamos
Component of Spring
. Es un concepto que contiene varios frijoles.Component class
necesita ser escaneado automáticamente por Spring para registrar esos beans delcomponent class
.2. Acerca de @Bean
@Bean se utiliza para anotar el método de
component-class
(como se mencionó anteriormente). Indica que la instancia retirada por el método anotado debe registrarseSpring-IOC-Container
.3. Conclusión
La diferencia entre ellos dos es relativamente obvia, se utilizan en
different circumstances
. El uso general es:fuente
Puntos adicionales de las respuestas anteriores
Digamos que tenemos un módulo que se comparte en múltiples aplicaciones y contiene algunos servicios. No todos son necesarios para cada aplicación.
Si usa @Component en esas clases de servicio y el escaneo de componentes en la aplicación,
En este caso, tenía que ajustar el filtrado del escaneo de componentes o proporcionar la configuración que incluso los beans no utilizados pueden ejecutar. De lo contrario, el contexto de la aplicación no se iniciará.
En este caso, es mejor trabajar con la anotación @Bean y solo instanciar esos beans,
Entonces, esencialmente, use @Bean para agregar clases de terceros al contexto. Y @Component si está solo dentro de su aplicación individual.
fuente