Статьи

Разница между @Component, @Service, @Controller и @Repository в Spring

Прежде чем вы узнаете разницу между @Component , @Service , @Controller и @Repository в @Repository Spring, важно понять роль аннотации @Component в Spring. Во время первоначального выпуска Spring все бины используются для объявления в XML-файле. Для большого проекта это быстро становится сложной задачей, и сотрудники Spring довольно быстро распознают проблему. В более поздних версиях они обеспечивают внедрение зависимостей на основе аннотаций и конфигурацию на основе Java. В Spring 2.5 было введено внедрение зависимостей на основе аннотаций, которое автоматически сканирует и регистрирует классы как bean-компонент Spring, который аннотируется с @Component аннотации @Component . Это означает, что вы не должны объявлять этот компонент с помощью <bean&gt ; помечать и вставлять зависимость, это будет сделано автоматически Spring. Эта функция была включена и отключена с помощью <context:component-scan> .

Теперь, когда вы знаете, что делает аннотация @Component , давайте посмотрим, что делают @Service , @Controller и @Repository . Это не что иное, как специализированная форма аннотации @Component для определенных ситуаций. Вместо использования @Component для класса контроллера в Spring MVC мы используем @Controller , which is more readable and appropriate @Controller which is more readable and appropriate .

Используя эту аннотацию, мы делаем две вещи: сначала мы объявляем, что этот класс является bean-компонентом Spring и должен создаваться и поддерживаться Spring ApplicationContext , но также мы указываем, что это контроллер в настройке MVC. Это последнее свойство используется веб-инструментами и функциями.

Например, DispatcherServlet будет искать @RequestMapping для классов, которые аннотируются с помощью @Controlle r, но не с @Component .

Это означает, что @Component и @Controller одинаковы в отношении создания bean-компонента и внедрения зависимости, но позже это специализированная форма первого. Даже если вы замените аннотацию @Compoenent , Spring может автоматически обнаружить и зарегистрировать класс контроллера, но он может работать не так, как вы ожидаете, в отношении отображения запросов. Вы можете видеть дальше,

То же самое верно для аннотаций @Service и @Repository , они являются специализацией @Component на уровне обслуживания и персистентности. @Service компонент Spring в сервисном слое должен быть аннотирован с помощью @Service вместо аннотации @Component а bean-компонент Spring в слое постоянства должен быть аннотирован с @Repositor аннотации @Repositor y.

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

Например, @Repository's не только помогает в конфигурировании на основе аннотаций, но также перехватывает специфичные для платформы исключения и повторно генерирует их как одно из унифицированных непроверенных исключений Spring.

Однако для этого вам также нужно объявить org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor как Spring bean в контексте вашего приложения.

Этот @Repository бина добавляет советник к любому @Repository , аннотированному @Repository так что любые специфичные для платформы исключения перехватываются и затем перебрасываются как одно из неконтролируемых исключений доступа к данным в Spring. Вы также можете увидеть Spring Framework 5: начинающий гуру на Udemy для более подробной информации.

Это также один из часто задаваемых вопросов о собеседовании в Spring и популярная концепция с точки зрения сертификации Spring. Вы найдете несколько вопросов на основе этих аннотаций и их использования в весеннем профессиональном сертификационном экзамене.

Как компонентное сканирование работает в Spring?

Начиная с Spring 2.0, Spring предоставляет <context:component-scan> и внедрение зависимостей на основе аннотаций для автоматического обнаружения и регистрации bean-компонента Spring вместо указания их в файле XML. Но он сканирует только @Component и не ищет @Controller , @Service и @Repository в целом. Они сканируются, потому что сами @Component .

Просто взгляните на определения аннотаций @Controller , @Service и @Repository :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
@Component
public @interface Service {
 
….
 
}
 
@Component
 
public @interface Repository {
 
….
 
}
 
@Component
 
public @interface Controller {
 
 
}

Таким образом, нельзя ошибочно утверждать, что @Controller , @Service и @Repository — это особые типы аннотации @Component . <context:component-scan> подбирает их и регистрирует их следующие классы как @Component , как если бы они были аннотированы @Component .

Они сканируются, потому что сами @Component аннотацией @Component . Если вы определяете свою собственную пользовательскую аннотацию и аннотируете ее с помощью @Component , то она также будет сканироваться с помощью <context:component-scan> .

Если вы хотите больше узнать о внедрении зависимостей, автоматическом подключении и различных типах конфигурации в Spring, например, на основе XML, на основе аннотаций и конфигурации Java в Spring, я предлагаю вам пройти курс Spring Fundamentals по Pluralsight. Бесплатная пробная версия также доступна.

Резюме

Вот хорошее резюме того, что делают @Component , @Service , @Controller и @Repository в Spring Framework:

  1. @Component — это общий стереотип для любого компонента или компонента, управляемого Spring.
  2. @Repository — это стереотип для персистентного слоя.
  3. @Service — это стереотип для сервисного уровня.
  4. @Controller — это стереотип для уровня представления (spring-MVC).

И вот хорошая диаграмма, объясняющая иерархию всех этих аннотаций в Spring Framework:

Это все о разнице между @Component , @Controller , @Service и @Repository в Spring Framework . Как я уже сказал, все они используются для автоматического обнаружения бинов Spring, когда включено сканирование контекста, и, по сути, предоставляют те же функциональные возможности в отношении внедрения зависимостей.

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

Вы можете прочитать больше о компонентном сканировании и о том, как Spring Framework автоматически обнаруживает bean-компонент в курсе Основы Spring, разработанном Бриной Хассен для Pluralsight. Вы также можете получить его бесплатно на 10 дней.

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

Другие статьи Spring Framework и вопросы для интервью, которые могут вам понравиться

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

См. Оригинальную статью здесь: Разница между @Component, @Service, @Controller и @Repository в Spring

Мнения, высказанные участниками Java Code Geeks, являются их собственными.