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


Можно @Component, @Repositoryа также @Serviceаннотации могут использоваться взаимозаменяемо весной или они обеспечивают какую-либо конкретную функциональность, кроме того, что действуют как устройство обозначения?

Другими словами, если у меня есть класс Service, и я изменяю аннотацию из @Serviceв @Component, будет ли он по-прежнему вести себя одинаково?

Или аннотация также влияет на поведение и функциональность класса?


1456


источник


Ответы:


Из Весенняя документация :

Весной 2.0 и более поздними @Repositoryаннотация - это маркер для   любой класс, который выполняет роль или стереотип (также известный как Data   Access Object или DAO) репозитория. Среди применений этого маркера   является автоматическим переводом исключений.

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

Поэтому вы можете комментировать классы компонентов с помощью @Component,   но путем аннотации их @Repository, @Service, или @Controllerвместо этого ваши классы более подходят для обработки инструментами   или связывание с аспектами. Например, эти аннотации для стереотипов   сделать идеальные цели для pointcut.

Таким образом, если вы выбираете между @Componentили @Serviceдля   ваш сервисный уровень, @Serviceбезусловно, лучший выбор. По аналогии,   как указано выше, @Repositoryуже поддерживается как маркер для   автоматический перевод исключений в вашем персистентном слое.

| Annotation | Meaning                                             |
+------------+-----------------------------------------------------+
| @Component | generic stereotype for any Spring-managed component |
| @Repository| stereotype for persistence layer                    |
| @Service   | stereotype for service layer                        |
| @Controller| stereotype for presentation layer (spring-mvc)      |

1056



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

Сначала сходство

Первое, что стоит подчеркнуть, - это то, что в отношении сканирования-автоматического обнаружения и инъекции зависимостей для BeanDefinition все эти аннотации (а именно @Component, @Service,   @Repository, @Controller) одинаковы. Мы можем использовать его на месте   другого и все еще можно обойти.


Различия между @Component, @Repository, @Controller и @Service

@Компонент

Это аннотация стереотипа общего назначения, указывающая, что класс является весенним компонентом.

Что особенного в @Component
<context:component-scan>только сканирование @Componentи не ищет @Controller, @Serviceа также @Repositoryв целом. Они сканируются, потому что они сами аннотируются @Component,

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

@Component
public @interface Service {
    ….
}

@Component
public @interface Repository {
    ….
}

@Component
public @interface Controller {
    …
}

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

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


@Repository

Это означает, что класс определяет репозиторий данных.

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

В дополнение к тому, что это Настройка на основе аннотаций , @RepositoryРабота заключается в том, чтобы уловить специфические исключения для платформы и перебросить их как одно из исключенных исключений из Spring. И для этого нам предоставляется PersistenceExceptionTranslationPostProcessor, что мы должны добавить в контекст приложения нашей Spring следующим образом:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

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


@Controller

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

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

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


@Обслуживание

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

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

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


Что еще?

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


386



Они почти одинаковы - все они означают, что класс - фасоль весны. @Service, @Repositoryа также @Controllerявляются специализированными @Components. Вы можете выполнять определенные действия с ними. Например:

  • @Controllerбобы используются весной-mvc
  • @Repositoryбобы имеют право на персистентность

Другое дело, что вы условно обозначаете компоненты семантически для разных слоев.

Одна вещь, которая @Componentчто вы можете аннотировать другие аннотации с ним, а затем использовать их так же, как и @Service,

Например, недавно я сделал:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

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


383



@Component эквивалентен

<bean>

@Service, @Controller, @Repository = {@Component + еще одна специальная функция}

Это означает, что Service, The Controller и Repository функционально одинаковы.

Три аннотации используются для разделения «Слои» в вашем приложении,

  • Контроллеры просто делают такие вещи, как диспетчеризация, переадресация, вызов методов обслуживания и т. Д.
  • Служба Hold Business Logic, Расчеты и т. Д.
  • Репозиторий - это DAO (объекты доступа к данным), они напрямую обращаются к базе данных.

Теперь вы можете спросить, зачем их разделять: (я полагаю, вы знаете AOP-Aspect Oriented Programming)

Предположим, вы хотите контролировать только активность слоя DAO. Вы напишете класс Aspect (A class), который выполняет некоторую регистрацию до и после каждого метода вашего DAO, вы можете сделать это с помощью AOP, поскольку у вас есть три разных слоя и не смешиваются.

Таким образом, вы можете выполнять протоколирование DAO «вокруг», «до» или «после» методов DAO. Вы могли бы это сделать, потому что у вас был DAO в первую очередь. То, что вы только что достигли, это Разделение проблем или задач.

Представьте себе, что есть только одна аннотация @Controller, тогда этот компонент будет иметь диспетчерскую, бизнес-логику и доступ к базе данных, все смешанные, так грязные коды!

Вышеупомянутый - один очень распространенный сценарий, есть еще много примеров использования трех аннотаций.


327



Весной @Component, @Service, @Controller, а также @Repositoryявляются аннотациями стереотипов, которые используются для:

@Controller:где твой запрос отображение на странице презентации сделано, то есть уровень представления не будет поступать ни в один другой файл, который он @Controllerкласс и проверки для запрашиваемого пути в @RequestMappingаннотация, написанная до вызова метода, если это необходимо.

@Service: Вся бизнес-логика здесь, т. Е. Вычисления, связанные с данными, и все. Это аннотация бизнес-уровня, в котором наш пользователь не напрямую вызывает метод сохранения, поэтому он будет вызывать этот метод, используя эту аннотацию. Он запросит @Repository по запросу пользователя

@Repository: Это уровень Persistence (уровень доступа к данным) приложения, который использовался для получения данных из базы данных. то есть все операции, связанные с базой данных, выполняются репозиторием.

@Component- Аннотировать другие компоненты (например, классы ресурсов REST) ​​с помощью компонентного стереотипа.

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

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

enter image description here


183



Spring 2.5 вводит дополнительные аннотации к стереотипам: @Component, @Service и @Controller. @Component служит общим стереотипом для любого компонента, управляемого Spring; тогда как @Repository, @Service и @Controller служат специализациями @Component для более конкретных случаев использования (например, на уровнях персистентности, обслуживания и представления). Это означает, что вы можете комментировать ваши классы компонентов с помощью @Component, но вместо этого добавив их в @Repository, @Service или @Controller, ваши классы более подходят для обработки инструментами или связывания с аспектами. Например, эти аннотации стереотипов делают идеальные цели для pointcut. Конечно, также возможно, что @Repository, @Service и @Controller могут нести дополнительную семантику в будущих выпусках Spring Framework. Таким образом, если вы принимаете решение об использовании @Component или @Service для вашего уровня обслуживания, @Service, безусловно, лучший выбор. Аналогично, как указано выше, @Repository уже поддерживается как маркер автоматического перевода исключений в вашем уровне персистентности.

@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

Справка :- Spring Documentation - сканирование классов, управляемые компоненты и записи конфигураций с использованием Java


59



@Component – Indicates a auto scan component.  
@Repository – Indicates DAO component in the persistence layer.  
@Service – Indicates a Service component in the business layer.   
@Controller – Indicates a controller component in the presentation layer.  

Вы заметили, что все @Repository, @Serviceили @Controllerаннотируются @Component, Итак, можем ли мы использовать @Componentдля всех компонентов для автоматического сканирования? Да, вы можете, и Spring автоматически сканирует все ваши компоненты с помощью @Component, аннотированных.

Он отлично работает, но не является хорошей практикой, для удобства чтения вы всегда должны заявлять @Repository, @Serviceили @Controllerдля определенного слоя, чтобы сделать ваш код более понятным для чтения.


51



Use of @Service and @Repository annotations are important from database connection perspective.

  1. Use @Service for all your web service type of DB connections
  2. Use @Repository for all your stored proc DB connections

If you do not use the proper annotations, you may face commit exceptions overridden by rollback transactions. You will see exceptions during stress load test that is related to roll back JDBC transactions.


40



Difference Between @Component, @Service and @Repository

Major difference between these stereotypes is they are used for different classification.

In a multitier application, we will have different layers like presentation, service, business, data access etc. When a class is to be annotated for auto-detection by Spring, then we should use the respective stereotype as below.

@Component – generic and can be used across application.
@Service – annotate classes at service layer level.
@Repository – annotate classes at persistence layer, which will act as database repository.

If technically they are going to be same then why do we need to use these at different layers level. Why not use the same at all layers. For example, if we use @Service in all layers, all the beans will get instantiated and no issues. There is a minor difference, for example consider @Repository.

The postprocessor automatically looks for all exception translators (implementations of the PersistenceExceptionTranslator interface) and advises all beans marked with the @Repository annotation so that the discovered translators can intercept and apply the appropriate translation on the thrown exceptions.

Similar to the above, in future Spring may choose to add value for @Service, @Controller and @Repository based on their layering conventions. To that additional feature advantage its better to respect the convention and use them in line with layers.

Other than the above, with respect to scan-auto-detection, dependency injection for BeanDefinition @Component, @Service, @Repository, @Controller are same.


30