При аннотировании класса с помощью @Component означает ли это, что это Spring Bean и Singleton?

111

Поскольку я новичок в Spring, у меня есть вопрос об аннотации класса. При аннотировании класса с помощью @Componentозначает ли это, что этот класс будет Spring Bean и по умолчанию singleton?

Марко
источник

Ответы:

130

Да, это правильно, @Componentэто Spring bean и Singleton.

Если класс принадлежит к уровню обслуживания, вы можете @Serviceвместо этого аннотировать его

Но имейте в виду, что для того, чтобы эти аннотации были обнаружены, вам необходимо поместить эту строку в applicationContext.xml:

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

О синглтонах - по умолчанию все компоненты Spring находятся в области синглтонов. Единственное, что вы должны иметь в виду, это то, что вы не должны хранить состояние в переменных поля (они должны содержать только зависимости). Таким образом, ваше приложение будет потокобезопасным, и вам не потребуется каждый раз новый экземпляр bean-компонента. Другими словами, ваши бобы не имеют состояния.

Божо
источник
1
При использовании аннотаций @Component и / или @Service и т. Д. Это означает, что я создаю синглтоны, не столкнусь ли я с проблемами параллелизма? На мой взгляд новичка, это приведет к созданию bean-компонента, который используется во всем ApplicationContext, поэтому одновременные пользователи получат ссылку на единственный bean-компонент. Или мне что-то не хватает?
Марко
3
@Marco, если у вас нет состояния (переменные экземпляра, отличные от Spring beans), проблем с параллелизмом возникать не будет.
Божо
вы «хотите» требовать новый экземпляр bean-компонента каждый раз, или вам «не нужно» каждый раз требовать новый экземпляр bean-компонента?
Harshana
@Bozho Что вы имеете в виду, говоря: «и вам не потребуется каждый раз новый экземпляр bean-компонента»? Означает ли это, что Spring не нужно будет создавать новый экземпляр или вам, как разработчику, не нужно будет создавать новый экземпляр?
user1766169
25

По умолчанию - Да.

Однако вы можете изменить это поведение с помощью @Scopeаннотации. Например:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Леа Зус
источник