Подтвердить что ты не робот

Является ли Spring аннотация @Controller таким же, как @Service?

Является ли Spring аннотация @Controller таким же, как @Service?

У меня есть идея о @Controller, которая может использоваться для отображения URL и вызова бизнес-логики.

while @Service используется для аннотирования класса сервиса, который содержит бизнес-логику.

Можно ли использовать @Controller вместо @Service для аннотации класса Service?

4b9b3361

Ответ 1

Нет, они очень отличаются друг от друга.

Оба представляют собой разные специализации аннотации @Component (на практике они представляют собой две разные реализации одного и того же интерфейса), поэтому оба они могут быть обнаружены при сканировании классов (если вы объявите его в своем XML конфигурация)

@Service аннотация используется на вашем уровне сервиса и комментирует классы, которые выполняют служебные задачи, часто вы его не используете, но во многих случаях вы используете эту аннотацию, чтобы представить наилучшую практику. Например, вы можете напрямую вызвать класс DAO для сохранения объекта в своей базе данных, но это ужасно. Очень хорошо назвать класс службы, который вызывает DAO. Это хорошая вещь, чтобы выполнить разделение проблемы.

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

Поэтому, глядя на архитектуру MVC Spring, у вас есть класс 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 к папке "/jobs".

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

Ответ 2

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

@Component
public @interface Service {
    ….
}

@Component
public @interface Controller {
    …
}

Тогда какая разница?

@Controller

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

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

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


@Service

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

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

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

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

Ответ 3

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

Ответ 4

@Service vs @Controller

@Service: class - это "Facility Business Facade" (в смысле ядра 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), как "операция, предлагаемая в качестве интерфейса, который стоит отдельно в модели без инкапсулированного состояния". Может также указать, что класс - это "Бизнес-фасад" (в смысле ядра 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, позволяя автоопределять классы реализации через сканирование траектории.

Ответ 5

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

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

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

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

Ответ 6

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

Почему вы так или иначе хотите, контроллер не сервис, и наоборот.