Оскільки у багатьох відповідях уже зазначено, для чого ці примітки використовуються, ми тут зупинимось на деяких незначних відмінностях.
Спочатку подібність
Перший момент, який варто ще раз підкреслити, - це те, що щодо автоматичного виявлення сканування та введення залежності для 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анотацією, а значить, вони також є @Components. Якщо ми визначимо власну власну анотацію та зазначаємо її @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основі їх облицювальних конвенцій. Отже, завжди корисно поважати конвенцію та використовувати її відповідно до шарів.