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



Весна аннотация @Controller то же, что и @Service?



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



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



могу ли я использовать @Controller вместо @Service аннотировать класс обслуживания?

840   6  

6 ответов:

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

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

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

@ Controller аннотация-это аннотация, используемая в Spring MVC framework (компонент 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-запросы к папке" / appointments "и в в частности, метод get-это метод, вызываемый для обработки всех запросов GET HTTP к папке "/ appointments".

Я надеюсь, что теперь это более ясно для вас.

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

@Component
public @interface Service {
    ….
}

@Component
public @interface Controller {
    …
}

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

@ Controller

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

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

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


@Service

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

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

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

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

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

@Service vs @Controller

@Service : class-это "фасад бизнес-сервиса" (в смысле основных шаблонов J2EE) или что-то подобное.

@Controller: указывает, что аннотированный класс является "контроллером" (например, веб-контроллером).

----------найти полезные заметки по основным стереотипам http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@интерфейс Компонент

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

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

другие аннотации уровня класса также могут рассматриваться как идентифицирующие компонент, как правило, особый вид компонента:например, аннотация @Repository или аннотация @AspectJ.

@интерфейс Контроллер

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

указывает, что аннотированный класс является "контроллером" (например, веб-контроллером).

эта аннотация служит специализацией @Component, позволяя автоматически определять классы реализации с помощью сканирования пути к классам. Он обычно используется в сочетании с аннотированными методами обработчика, основанными на аннотации RequestMapping.

@интерфейс Сервис

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

указывает, что аннотированный класс является "службой", первоначально определенной доменным дизайном (Evans, 2003) как "операция, предлагаемая в качестве интерфейса, который стоит отдельно в модели, без инкапсулированного состояния." Может также указывать на то, что класс является "фасадом бизнес-сервиса" (в основном смысле J2EE patterns) или чем-то подобным. Эта аннотация является стереотипом общего назначения, и отдельные команды могут сузить свою семантику и использовать в качестве соответствующий.

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

@Interface Repository

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

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

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

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

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

не различаются.

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

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

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

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

Comments

    Ничего не найдено.