Lorsque vous annotez une classe avec @Component, cela signifie-t-il qu'il s'agit d'un Spring Bean and Singleton?

111

Étant assez nouveau dans Spring, j'ai une question sur l'annotation d'une classe. Lorsque vous annotez une classe avec, @Componentcela signifie-t-il que cette classe sera un Spring Bean et par défaut un singleton?

Marco
la source

Réponses:

129

Oui, c'est correct, @Componentc'est un haricot de printemps et un singleton.

Si la classe appartient à la couche de service, vous souhaiterez peut-être l'annoter à la @Serviceplace

Mais gardez à l'esprit que pour que ces annotations soient détectées, vous devez placer cette ligne dans applicationContext.xml:

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

À propos des singletons - les beans spring sont tous dans la portée singleton par défaut. La seule chose que vous devez garder à l'esprit est que vous ne devez pas stocker l'état dans des variables de champ (elles ne doivent contenir que des dépendances). Ainsi, votre application sera thread-safe, et vous n'aurez pas besoin d'une nouvelle instance d'un bean à chaque fois. En d'autres termes, vos beans sont apatrides.

Bozho
la source
1
Lorsque j'utilise les annotations @Component et / ou @Service, etc. signifie que je crée des Singletons, ne vais-je pas rencontrer de problèmes de concurrence? Selon mon idée de débutant, il en résultera un bean qui est utilisé dans tout le ApplicationContext, de sorte que les utilisateurs simultanés obtiendront une référence au bean unique. Ou est-ce que je manque quelque chose?
Marco
3
@Marco si vous n'avez aucun état (variables d'instance différentes des beans spring), aucun problème de concurrence ne se produira.
Bozho
vous "voulez" avoir besoin d'une nouvelle instance d'un bean à chaque fois ou vous "n'aurez pas" besoin d'une nouvelle instance d'un bean à chaque fois?
Harshana
@Bozho Qu'entendez-vous par: "et vous n'aurez pas besoin d'une nouvelle instance d'un bean à chaque fois"? Cela signifie-t-il que Spring n'aura pas à créer une nouvelle instance ou que vous en tant que développeur n'auriez pas besoin de créer une nouvelle instance?
user1766169
24

Par défaut - Oui.

Cependant, vous pouvez remplacer ce comportement à l'aide de l' @Scopeannotation. Par exemple:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Léa Zus
la source