Прежде чем вы узнаете разницу между @Component
, @Service
, @Controller
и @Repository
в @Repository
Spring, важно понять роль аннотации @Component
в Spring. Во время первоначального выпуска Spring все бины используются для объявления в XML-файле. Для большого проекта это быстро становится сложной задачей, и сотрудники Spring довольно быстро распознают проблему. В более поздних версиях они обеспечивают внедрение зависимостей на основе аннотаций и конфигурацию на основе Java. В Spring 2.5 было введено внедрение зависимостей на основе аннотаций, которое автоматически сканирует и регистрирует классы как bean-компонент Spring, который аннотируется с @Component
аннотации @Component
. Это означает, что вы не должны объявлять этот компонент с помощью <bean>
; помечать и вставлять зависимость, это будет сделано автоматически 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:
-
@Component
— это общий стереотип для любого компонента или компонента, управляемого Spring. -
@Repository
— это стереотип для персистентного слоя. -
@Service
— это стереотип для сервисного уровня. -
@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 и вопросы для интервью, которые могут вам понравиться
- Разница между
@RestController
и@Controller
в Spring MVC? - Как Spring MVC работает внутри?
- Какая польза от DispatcherServlet в Spring MVC?
- Как включить безопасность Spring в веб-приложении Java?
- Разница между @RequestParam и @PathVariable в Spring MVC?
- Весна в действии Крейг Уоллс
- ОТДЫХ с весенним мастер-классом Евгения Параскива
Спасибо за чтение этой статьи до сих пор. Если вам понравилась эта статья, пожалуйста, поделитесь с друзьями и коллегами. Если у вас есть какие-либо вопросы или пожелания, напишите нам.
См. Оригинальную статью здесь: Разница между @Component, @Service, @Controller и @Repository в Spring
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |