web-dev-qa-db-fra.com

Lorsque vous annotez une classe avec @Component, cela signifie-t-il qu'il s'agit d'un bean printanier et d'un singleton?

étant assez nouveau au printemps, j'ai une question à propos de l'annotation d'une classe. Lors de l'annotation d'une classe avec @Component Est-ce que cela signifie que cette classe sera un Spring Bean et, par défaut, un singleton?

92
Marco

Oui c'est correct, @Component est un haricot printanier et un singleton.

Si la classe appartient à la couche service, vous pouvez l'annoter avec @Service au lieu

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 haricots de printemps sont tous dans singleton scope par défaut. La seule chose à garder à l'esprit est de ne pas stocker d'état dans les 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 haricots sont sans état.

106
Bozho

Par défaut - oui.

Cependant, vous pouvez remplacer ce comportement en utilisant l'annotation @Scope. Par exemple: @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

13
Lea Zus