@Service проти @Controller
@Service: клас - це "Фасад бізнес-сервісу" (у розумінні шаблонів Core J2EE) або щось подібне.
@Controller: вказує, що анотований клас є "контролером" (наприклад, веб-контролером).
---------- Знайдіть корисні примітки щодо основних стереотипів
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
Компонент @interface
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
public @interface Component
Вказує, що анотований клас є компонентом. Такі класи розглядаються як кандидати на автоматичне виявлення при використанні конфігурації на основі анотацій та сканування шляху до класу.
Інші анотації на рівні класу можуть розглядатися як ідентифікаційні компоненти, як правило, особливого типу: наприклад, анотація @Repository або анотація @Aspect від AspectJ.
@interface Controller
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
Вказує, що анотований клас є "контролером" (наприклад, веб-контролером).
Ця анотація служить спеціалізацією @Component, що дозволяє автоматично визначати класи реалізації за допомогою сканування шляху до класу. Зазвичай він використовується в поєднанні з анотованими методами обробника, заснованими на анотації RequestMapping.
Служба @ інтерфейсу
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
Вказує на те, що анотований клас - це "Сервіс", спочатку визначений Domain-Driven Design (Evans, 2003) як "операція, запропонована як інтерфейс, який є самостійним у моделі, без інкапсульованого стану". Також може означати, що клас - це "Фасад бізнес-послуг" (у розумінні шаблонів Core J2EE) або щось подібне. Ця анотація є загальним стереотипом, і окремі команди можуть звужувати свою семантику та використовувати за необхідності.
Ця анотація служить спеціалізацією @Component, що дозволяє автоматично визначати класи реалізації за допомогою сканування шляху до класу.
Репозиторій @interface
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
Вказує на те, що анотований клас є "Сховищем", спочатку визначеним Домен-керуваним дизайном (Evans, 2003) як "механізм інкапсуляції сховища, пошуку та поведінки пошуку, який емулює колекцію об'єктів". Команди, що реалізують традиційні шаблони J2EE, такі як "Об'єкт доступу до даних", також можуть застосовувати цей стереотип до класів DAO, хоча перед цим слід подбати про розуміння відмінності між об'єктами доступу до даних та сховищами в стилі DDD. Ця анотація є загальним стереотипом, і окремі команди можуть звужувати свою семантику та використовувати за необхідності.
Анотований таким чином клас придатний для перекладу Spring DataAccessException, коли він використовується разом із PersistenceExceptionTranslationPostProcessor. Анотований клас також уточнюється щодо його ролі в загальній архітектурі програми з метою оснащення, аспектів тощо.
Починаючи з весни 2.5, ця анотація також служить спеціалізацією @Component, що дозволяє автоматично визначати класи реалізації за допомогою сканування шляху до класу.