Нет, они сильно отличаются друг от друга.
Обе являются разными специализациями аннотации @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 к папке «/ встречи».
Надеюсь, теперь вам стало понятнее.
Если вы посмотрите на определения
@Controller
,@Service
аннотации, то вы увидите , что это особый тип@Component
аннотаций.@Component public @interface Service { …. }
@Component public @interface Controller { … }
Так в чем разница?
@Controller
Аннотации указывает на то, что конкретный класс играет роль контроллера.@Controller
Аннотацию выступает в качестве стереотипа для аннотированный класса, что указывает на его роль.Что особенного в @Controller?
Вы не можете поменять местами эту аннотацию с другими подобными
@Service
или@Repository
, даже если они выглядят одинаково. Диспетчер сканирует аннотированные классы@Controller
и обнаруживает@RequestMapping
в них аннотации. Вы можете использовать только@RequestMapping
на@Controller
аннотированных классов.@Services
сохранить бизнес-логику и метод вызова на уровне репозитория.Что особенного в @Service?
Помимо того факта, что он используется для указания того, что он содержит бизнес-логику, в этой аннотации нет заметных особенностей, но кто знает, spring может добавить некоторые дополнительные исключения в будущем.
Связанный ответ: в чем разница между аннотациями @Component, @Repository и @Service в Spring?
источник
Нет,
@Controller
это не то же самое@Service
, хотя они оба являются специализациями@Component
, что делает их обоих кандидатами на обнаружение путем сканирования пути к классам.@Service
Аннотаций используется в вашем слое службы, и@Controller
для контроллеров Spring MVC в презентации слоя. Как@Controller
правило, он имеет сопоставление URL-адресов и запускается веб-запросом.источник
@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, позволяя автоматически определять классы реализации посредством сканирования пути к классам.
источник
Я уже отвечал на аналогичный вопрос здесь. Вот ссылка.
Нет, оба разные.
Аннотации @Service используются для других целей, а @Controller - для других. На самом деле аннотации Spring @Component, @Service, @Repository и @Controller используются для автоматического обнаружения bean-компонентов с использованием сканирования пути к классам в Spring framework, но это не означает, что все функции одинаковы. @Service: указывает, что аннотированный класс является компонентом службы на бизнес-уровне.
@Controller: аннотированный класс указывает, что это компоненты контроллера и в основном используются на уровне представления.
источник
Нет, ты не можешь, они разные. Когда приложение будет развернуто, ваши сопоставления контроллеров будут, например, отключены.
Зачем все-таки, контроллер - это не сервис, и наоборот.
источник
Весна в действии
источник
Вы можете объявить @service как @Controller .
Вы НЕ можете объявлять @Controller как @Service
@Обслуживание
Это нормально. Вы просто объявляете класс как компонент.
@Controller
Он немного более особенный, чем Component. Диспетчер будет искать @RequestMapping здесь. Таким образом, класс, аннотированный с помощью @Controller, будет дополнительно уполномочен объявлять URL-адреса, через которые вызываются API.
источник
источник