Аннотации 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 - это метод, вызываемый для обработки всех HTTP-запросов GET к папке «/ встречи».

Надеюсь, теперь вам стало понятнее.


3
Очень красивое объяснение. Следует отметить, что классы контроллеров (at) не должны иметь (at) RequestMapping, (at) RequestMapping также может быть на уровне метода.
хронометрист

1
Могу ли я смешать их в одном определении класса? Или лучше реализовать их как отдельные классы?
кенсай

37

Если вы посмотрите на определения @Controller, @Serviceаннотации, то вы увидите , что это особый тип @Componentаннотаций.

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

Так в чем разница?

@Controller

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

Что особенного в @Controller?

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


@Обслуживание

@Services сохранить бизнес-логику и метод вызова на уровне репозитория.

Что особенного в @Service?

Помимо того факта, что он используется для указания того, что он содержит бизнес-логику, в этой аннотации нет заметных особенностей, но кто знает, spring может добавить некоторые дополнительные исключения в будущем.

Связанный ответ: в чем разница между аннотациями @Component, @Repository и @Service в Spring?


7

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


5

@Service против @Controller

@Service: class - это «фасад бизнес-службы» (в смысле паттернов 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 или аннотация AspectJ @Aspect.

@interface Контроллер

@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

Указывает, что аннотированный класс является «репозиторием», первоначально определенным Domain-Driven Design (Evans, 2003) как «механизм для инкапсуляции поведения при хранении, извлечении и поиске, который имитирует набор объектов». Команды, реализующие традиционные шаблоны J2EE, такие как «объект доступа к данным», также могут применять этот стереотип к классам DAO, хотя перед этим необходимо понять разницу между объектом доступа к данным и репозиториями в стиле DDD. Эта аннотация представляет собой стереотип общего назначения, и отдельные команды могут сузить свою семантику и использовать ее по мере необходимости.

Аннотированный таким образом класс имеет право на преобразование Spring DataAccessException при использовании вместе с PersistenceExceptionTranslationPostProcessor. Аннотированный класс также поясняется в отношении его роли в общей архитектуре приложения с точки зрения инструментов, аспектов и т. Д.

Начиная с Spring 2.5, эта аннотация также служит специализацией @Component, позволяя автоматически определять классы реализации посредством сканирования пути к классам.


1

Я уже отвечал на аналогичный вопрос здесь. Вот ссылка.

Нет, оба разные.

Аннотации @Service используются для других целей, а @Controller - для других. На самом деле аннотации Spring @Component, @Service, @Repository и @Controller используются для автоматического обнаружения bean-компонентов с использованием сканирования пути к классам в Spring framework, но это не означает, что все функции одинаковы. @Service: указывает, что аннотированный класс является компонентом службы на бизнес-уровне.

@Controller: аннотированный класс указывает, что это компоненты контроллера и в основном используются на уровне представления.


0

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

Зачем все-таки, контроллер - это не сервис, и наоборот.


0

Весна в действии

Как видите, этот класс аннотирован @Controller. Сам по себе @Controller мало что делает. Его основная цель - идентифицировать этот класс как компонент для сканирования компонентов. Поскольку HomeController аннотируется @Controller, сканирование компонентов Spring автоматически обнаруживает его и создает экземпляр HomeController как bean-компонент в контексте приложения Spring.

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


0

Вы можете объявить @service как @Controller .

Вы НЕ можете объявлять @Controller как @Service

@Обслуживание

Это нормально. Вы просто объявляете класс как компонент.

@Controller

Он немного более особенный, чем Component. Диспетчер будет искать @RequestMapping здесь. Таким образом, класс, аннотированный с помощью @Controller, будет дополнительно уполномочен объявлять URL-адреса, через которые вызываются API.


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