Как различать аннотации @Component, @Repository, @Service в spring|Java Debug Notes

Java

Эта статья участвует в «Месяце тем Java — Заметки по отладке Java», подробнее см. Ссылка на мероприятие>

Вопрос: Как отличить аннотации @Component, @Repository, @Service в spring?

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

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

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

ответь один

Аннотация @Repository — это маркер для любого класса, который удовлетворяет роли хранилища или прототипу (также известному как объект доступа к данным или DAO). Одним из применений этого флага является автоматический перевод исключений.

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

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

аннотация имея в виду
@Component Общий прототип для любого компонента, управляемого Spring
@Repository Прототип персистентного слоя
@Service прототип сервисного уровня
@Controller Прототип уровня представления (spring-mvc)

Ответить два

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

Поговорим о сходстве

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

Разница между этими аннотациями

@Component

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

  • Что такого особенного в @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>Возьмите их и зарегистрируйте их классы как bean-компоненты, как если бы все они были аннотированы с помощью @Component.

Аннотации специального типа также сканируются, поскольку они снабжены аннотацией @component, что означает, что они являются @components. Если мы определим ваши собственные аннотации и используем @component для их аннотирования, то это будет<context:component-scan>Сканировать в.

@Repository

Эта аннотация определяет класс как класс хранения данных

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

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

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

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

@Controller

Аннотация @Controller указывает, что конкретный класс действует как контроллер.

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

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

@Service

@Service в основном пишет бизнес-логику.

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

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

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

Статья переведена с Stack Overflow:stackoverflow.com/questions/6…