Al anotar una clase con @Component, ¿significa esto que es un Spring Bean y Singleton?

111

Siendo bastante nuevo en Spring, tengo una pregunta sobre cómo anotar una clase. Al anotar una clase con, @Component¿significa esto que esta clase será un Spring Bean y, por defecto, un singleton?

Marco
fuente

Respuestas:

129

Sí, eso es correcto, @Componentes un Spring bean y un Singleton.

Si la clase pertenece a la capa de servicio es posible que desee realizar anotaciones con @Servicesu lugar

Pero tenga en cuenta que para que se detecten estas anotaciones, debe colocar esta línea en applicationContext.xml:

<context:component-scan base-package="com.yourcompany" />

Acerca de los singleton: los frijoles de primavera están todos en el alcance de singleton de forma predeterminada. Lo único que debe tener en cuenta es que no debe almacenar el estado en las variables de campo (solo deben contener dependencias). Por lo tanto, su aplicación será segura para subprocesos y no necesitará una nueva instancia de un bean cada vez. En otras palabras, sus frijoles son apátridas.

Bozho
fuente
1
Cuando uso las anotaciones @Component yo @Service, etc., significa que estoy creando Singletons, ¿no tendré problemas de concurrencia? Para mi idea de novato, resultará en un bean que se usa en todo el ApplicationContext, por lo que los usuarios simultáneos obtendrán una referencia al bean único. ¿O me estoy perdiendo algo?
Marco
3
@Marco, si no tiene ningún estado (variables de instancia diferentes de los frijoles de primavera), no se producirán problemas de concurrencia.
Bozho
¿"quiere" requerir una nueva instancia de un bean cada vez o "no" requerirá una nueva instancia de un bean cada vez?
Harshana
@Bozho ¿Qué quieres decir con: "y no necesitarás una nueva instancia de un bean cada vez"? ¿Significa que Spring no tendrá que crear una nueva instancia o que usted, como desarrollador, no necesitará crear una nueva instancia?
user1766169
24

De forma predeterminada: sí.

Sin embargo, puede anular este comportamiento mediante la @Scopeanotación. Por ejemplo:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Lea Zus
fuente