Якщо анотувати клас з @Component, це означає, що це Spring Bean та Singleton?


111

Будучи досить новинкою у Spring, у мене є питання щодо анотування класу. Якщо анотувати клас з @Componentчи означає це, що цей клас буде Spring Bean, а за замовчуванням сингл?

Відповіді:


129

Так, це правильно, @Componentвесняний боб та синглтон.

Якщо клас належить до рівня обслуговування, ви можете @Serviceзамість цього анотувати його

Але майте на увазі, що для виявлення цих анотацій вам потрібно розмістити цей рядок у applicationContext.xml:

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

Про синглтон - ясна квасоля за замовчуванням все в межах однотонних. Єдине, що ви повинні мати на увазі, це те, що ви не повинні зберігати стан у змінних поля (вони повинні містити лише залежності). Таким чином, ваша програма буде безпечною для потоків, і вам не буде потрібно кожен раз новий екземпляр квасолі. Іншими словами, ваші боби без громадянства.


1
Якщо ви користуєтеся анотаціями @Component та @Service тощо. Це означає, що я створюю Singletons, чи не зіткнуться з проблемами одночасності? Для моєї ідеї для початківців це призведе до отримання бобів, які використовуються в усій програмі ApplicationContext, тому одночасні користувачі отримують посилання на один боб. Або я щось пропускаю?
Марко

3
@Marco, якщо у вас немає стану (змінні екземпляра, відмінні від весняних бобів), проблем із одночасністю не виникне.
Божо

ви "хочете" вимагати кожного разу новий екземпляр квасолі або вам "не хочеться" вимагати кожного разу новий екземпляр квасолі?
Харшана

@Bozho Що ви маєте на увазі під собою: "і вам не потрібно буде вимагати новий екземпляр квасолі кожного разу"? Ви маєте на увазі, що Spring не доведеться створювати новий екземпляр, або вам як розробнику не потрібно буде створювати новий екземпляр?
користувач1766169

24

За замовчуванням - Так.

Однак ви можете змінити цю поведінку за допомогою @Scopeпримітки. Наприклад:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.