Ao anotar uma classe com @Component, isso significa que é um Spring Bean e Singleton?


111

Sendo relativamente novo no Spring, tenho uma pergunta sobre como fazer anotações em uma aula. Ao anotar uma classe com @Componentisso significa que essa classe será um Spring Bean e, por padrão, um singleton?

Respostas:


129

Sim, isso é correto, @Componenté um feijão Spring e um Singleton.

Se a classe pertence à camada de serviço que você pode querer anotá-lo com @Servicevez

Mas tenha em mente que, para que essas anotações sejam detectadas, você precisa colocar esta linha em applicationContext.xml:

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

Sobre singletons - os grãos de primavera estão todos no escopo singleton por padrão. A única coisa que você deve ter em mente é que você não deve armazenar o estado em variáveis ​​de campo (elas devem conter apenas dependências). Portanto, seu aplicativo será seguro para thread e você não precisará de uma nova instância de um bean a cada vez. Em outras palavras, seus grãos não têm estado.


1
Ao usar as anotações @Component e / ou @Service etc. significa que estou criando Singletons, não terei problemas de simultaneidade? Para minha ideia de novato, isso resultará em um bean que é usado em todo o ApplicationContext, portanto, os usuários simultâneos obterão uma referência para o único bean. Ou eu estou esquecendo de alguma coisa?
Marco

3
@Marco se você não tiver nenhum estado (variáveis ​​de instância diferentes dos grãos de primavera), então nenhum problema de simultaneidade ocorrerá.
Bozho

você "deseja" exigir uma nova instância de um bean a cada vez ou "não" exigirá uma nova instância de um bean a cada vez?
Harshana de

@Bozho O que você quer dizer com: "e você não exigirá uma nova instância de um bean a cada vez"? Isso significa que o Spring não terá que criar uma nova instância ou você, como desenvolvedor, não precisará criar uma nova instância?
user1766169

24

Por padrão - sim.

No entanto, você pode substituir esse comportamento usando a @Scopeanotação. Por exemplo:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.