Эта статья участвует в «Месяце тем 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…