Чи є анотація Spring @Controller такою ж, як @Service?


80

Анотація Spring @Controllerтака ж, як @Service?

Я маю уявлення про те, @Controllerщо можна використовувати для URLкартографування та використання бізнес-логіки.

в той час як @Serviceвикористовується для анотації класу обслуговування, який містить бізнес-логіку.

Чи можу я використовувати @Controllerзамість того, @Serviceщоб анотувати клас обслуговування?

Відповіді:


124

Ні, вони досить сильно відрізняються один від одного.

Обидві різні спеціалізації анотації @Component (на практиці це дві різні реалізації одного і того ж інтерфейсу), тому обидві можуть бути виявлені шляхом сканування шляху до класу (якщо ви заявите це у своїй конфігурації XML)

Анотація @Service використовується у вашому сервісному рівні та коментує класи, які виконують сервісні завдання, часто ви не використовуєте її, але в багатьох випадках ви використовуєте цю анотацію, щоб представити найкращу практику. Наприклад, ви можете безпосередньо викликати клас DAO, щоб зберегти об'єкт у вашій базі даних, але це жахливо. Дуже добре зателефонувати в сервісний клас, який викликає DAO. Це добре, щоб виконати схему поділу проблем.

Анотація @Controller - це анотація, яка використовується у середовищі Spring MVC (компонент Spring Framework, що використовується для реалізації веб-програми). Анотація @Controller вказує на те, що певний клас виконує роль контролера. Анотація @Controller діє як стереотип для анотованого класу, вказуючи на його роль. Диспетчер сканує такі анотовані класи на відображені методи та виявляє анотації @RequestMapping.

Отже, дивлячись на архітектуру Spring MVC, у вас є клас DispatcherServlet (який ви заявляєте у своїй конфігурації XML), який представляє передній контролер, який відправляє всі HTTP-запити до відповідних класів контролерів (анотований @Controller). Цей клас виконує бізнес-логіку (і може викликати служби) за своїм методом. Ці класи (або його методи), як правило, анотуються також анотацією @RequestMapping, яка вказує, яким HTTP-запитом обробляється контролер і його метод.

Наприклад:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() {
        return appointmentBook.getAppointmentsForToday();
    }

Цей клас є контролером.

Цей клас обробляє всі HTTP-запити до "/ призначення" "папки", і зокрема метод get - це метод, який викликається для обробки всіх запитів GET HTTP до папки "/ призначення".

Я сподіваюся, що зараз для вас це зрозуміліше.


3
Дуже приємне пояснення. Слід зазначити, що для класів контролерів (at) не потрібно мати (at) RequestMapping, (at) RequestMapping також може бути на рівні методу.
хронометрист

1
Чи можу я змішати їх у визначенні одного класу? Або краще застосовувати їх як окремі класи?
kensai

37

Якщо ви подивіться на визначення @Controller, @Serviceанотації, то ви побачите , що це особливий тип @Componentанотацій.

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

То яка різниця?

@Controller

@ControllerАнотації вказує на те, що конкретний клас грає роль контролера. @ControllerАнотацію виступає в якості стереотипу для анотований класу, що вказує на його роль.

Що особливого в @Controller?

Ви не можете замінити цю анотацію будь-яким іншим подібним @Serviceабо @Repository, хоча вони виглядають однаково. Диспетчер сканує класи, анотовані @Controllerта виявляє @RequestMappingанотації в них. Ви можете використовувати лише @RequestMappingдля @Controllerанотованих класів.


@Service

@Services утримуйте бізнес-логіку та метод виклику на рівні сховища.

Що особливого в @Service?

Окрім того, що він використовується для вказівки на те, що він утримує бізнес-логіку, немає жодної помітної спеціальності, яку надає ця анотація, але хто знає, навесні може додати ще кілька винятків у майбутньому.

Відповідна відповідь: Яка різниця між анотаціями @Component, @Repository & @Service навесні?


7

Ні, @Controllerце не те саме, що @Service, хоча вони обидва є спеціалізаціями @Component, що робить їх обох кандидатами на відкриття шляхом сканування шляхів класу . @ServiceАнотацій використовується в вашому шарі служби, і @Controllerдля контролерів Spring MVC в презентації шару. Як @Controllerправило, це має відображення URL-адреси, яке ініціюється веб-запитом.


5

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


1

Я вже відповів на подібне запитання тут Ось посилання

Жодне не відрізняється.

Анотації @Service використовуються для інших цілей, а @Controller - для інших. Насправді анотації Spring @Component, @Service, @Repository та @Controller використовуються для автоматичного виявлення компонентів за допомогою сканування шляху до класу в рамках Spring, але це не означає, що всі функції однакові. @Service: Вказує, що анотований клас є компонентом Служби на бізнес-рівні.

@Controller: Анотований клас вказує, що він є компонентами контролера і в основному використовується на рівні презентації.


0

Ні, ти не можеш, вони різні. Коли програма була розгорнута, ваші зіставлення контролерів, наприклад, були б застосовані.

Чому ти все одно хочеш, контролер не є послугою, і навпаки.


0

Від весни в дії

Як бачите, цей клас коментується @Controller. Сам по собі @Controller не робить багато. Його основна мета - визначити цей клас як компонент для сканування компонентів. Оскільки HomeController коментується @Controller, сканування компонентів Spring автоматично виявляє його та створює екземпляр HomeController як компонент у контексті програми Spring.

Насправді жменька інших анотацій (включаючи @Component, @Service та @Repository) виконує цілі, подібні до @Controller. Ви могли б так само ефективно коментувати HomeController будь-якою з цих інших анотацій, і він все одно працював би так само. Однак вибір @Controller є більш описовим щодо ролі цього компонента в додатку.


0

Ви можете оголосити службу @ як @Controller .

Ви НЕ можете оголосити @Controller як @Service

@Service

Це регулярно. Ви просто оголошуєте клас як Компонент.

@Controller

Це трохи більше, ніж Component. Диспетчер буде шукати @RequestMapping тут. Отже, клас, котрий коментується @Controller, буде додатково наділений можливістю оголошення URL-адрес, через які викликаються API.


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