Оскільки у багатьох відповідях уже зазначено, для чого ці примітки використовуються, ми тут зупинимось на деяких незначних відмінностях.
Спочатку подібність
Перший момент, який варто ще раз підкреслити, - це те, що щодо автоматичного виявлення сканування та введення залежності для BeanDefinition всі ці анотації (а саме: @Component, @Service, @Repository, @Controller) однакові. Ми можемо використовувати одне замість іншого і все одно можемо обійтись.
Відмінності між @Component, @Repository, @Controller та @Service
@ Компонент
Це стереотипна анотація загального призначення, яка вказує на те, що клас - це компонент весни.
Що особливого в @Component
<context:component-scan>
сканує@Component
і не шукає@Controller
,@Service
і@Repository
взагалі. Вони скануються, тому що самі позначаються на них@Component
.
Просто погляньте на @Controller
, @Service
і @Repository
визначення анотацій:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Таким чином, це неправильно сказати @Controller
, @Service
і @Repository
це спеціальні типи @Component
анотацій. <context:component-scan>
збирає їх і реєструє наступні класи як квасоля, так само, як якщо б вони були помічені @Component
.
Анотації спеціального типу також скануються, оскільки вони самі позначаються @Component
анотацією, а значить, вони також є @Component
s. Якщо ми визначимо власну власну анотацію та зазначаємо її @Component
, вона також буде скануватися<context:component-scan>
@ Репозиторій
Це означає, що клас визначає сховище даних.
Що особливого у @Repository?
Крім того, що вказується, що це конфігурація на основі анотацій , @Repository
завдання полягає в тому, щоб знайти винятки на платформі і викинути їх як одне з єдиних неперевірених винятків Spring. Для цього нам забезпечено PersistenceExceptionTranslationPostProcessor
, що ми повинні додати в контекст програми нашого весни такі:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Цей процесор після розміщення компонентів додає радника до будь-якого квасолі, котру зазначається, @Repository
так що будь-які винятки, що стосуються певної платформи, виявляються та повторно передаються як одне з винятків вивірених даних щодо доступу до даних Spring.
@Controller
@Controller
Анотації вказує на те, що конкретний клас грає роль контролера. @Controller
Анотацію виступає в якості стереотипу для анотований класу, що вказує на його роль.
Що особливого у @Controller?
Ми не можемо переключити цю примітку з будь-якими іншими подібними @Service
або @Repository
, навіть якщо вони виглядають однаково. Диспетчер сканує класифіковані класи @Controller
та виявляє методи, помічені із @RequestMapping
примітками в них. Ми можемо використовувати @RequestMapping
в / в тільки ті методи , чиї класи з анотацією , @Controller
і вона буде НЕ працювати з @Component
, @Service
, і @Repository
т.д. ...
Примітка: Якщо клас вже зареєстрований як боб через будь-який альтернативний спосіб, як через @Bean
або з допомогою @Component
, і @Service
т.д. ... анотацій, то @RequestMapping
може бути обраний , якщо клас також з анотацією @RequestMapping
анотацію. Але це вже інший сценарій.
@ Сервіс
@Service
боби дотримуються бізнес-логіки та методів виклику в шарі сховища.
Що особливого у @Service?
Крім того, що він використовується для вказівки, що він дотримується ділової логіки, в цій анотації немає нічого іншого помітного; але хто знає, Весна може додати ще додаткових винятків у майбутньому.
Що ще?
Подібно вище, в майбутньому Spring може додавати спеціальні функціональні можливості для @Service
, @Controller
і на @Repository
основі їх облицювальних конвенцій. Отже, завжди корисно поважати конвенцію та використовувати її відповідно до шарів.