Дополнительно
В чем разница между аннотациями @Component, @Repository и @Service в Spring?
Могут ли аннотации @Component
, @Repository
и @Service
использоваться в Spring взаимозаменяемо или они предоставляют какую-то особую функциональность, помимо того, что служат в качестве устройства для обозначений?
Другими словами, если у меня есть класс Service и я изменю аннотацию с @Service
на @Component
, будет ли он вести себя так же?
Или аннотация также влияет на поведение и функциональность класса?
1957
20
Из Spring Documentation:
Столько ответов уже, что эти аннотации используются, мы'МР здесь внимание на некоторые незначительные различия между ними.
Различия между @компонентов, @репозитория, контроллер @и @#обслуживание
Это общего назначения стереотип аннотация указывает, что класс является компонентом Spring.
Что особенного @составляющей в
<контексте:компонент сканирования и GT;
сканирует@составляющую и не искать
@контроллер,
репозиторий@Serviceи
@в целом. Они проверяются, потому что они сами помечаются
@компонентов`.Просто взгляните на
@контроллер
,@Service
и@репозитория
аннотация определений:Таким образом, это не будет неправильным сказать, что
@контроллер
,@Service
и@репозитория
специальные типы аннотации@компонентов
. в<контексте:компонент сканирования и GT;
берет их и регистрирует их следующие сорта фасоли, как если бы они были аннотированы с@компонентов
.Специальный тип аннотации также по этой, потому что они сами с аннотацией аннотации
@компонент
, что означает, что они также@компонента. Если мы определим наши собственные пользовательские аннотации и аннотировать его с@компонента, он также будет получать по этой С в
<контексте:компонент сканирования и GT;`Это, чтобы указать, что класс определяет хранилища данных.
Что особенного @репозиторий?
В дополнение к отметив, что это аннотации на основе конфигурации,
@репозиторий
работа, чтобы поймать платформы конкретные исключения и повторно создавать их как один из источников единого исключение непроверенное. Для этого мы обеспеченыPersistenceExceptionTranslationPostprocessor
, что мы должны добавить в приложения в контексте нашей весны такой:Этот постпроцессор фасоли добавляет советник на любой фасоли, который аннотируется `@репозитория так, что любая платформа-конкретные исключения, ловят и снова бросают в качестве одного из непроверенных источников исключения доступа к данным.
В аннотации
@контроллер
показывает, что конкретный класс выполняет роль контроллера. В `@контроллер аннотации выступает как стереотип для аннотированного класса, указывая на его роль.Что особенного контроллера@?
Мы не можем переключить эту аннотацию с любой другой, Как
@эксплуатации " или " @хранилище
, даже если они выглядят одинаково. Диспетчер сканирует классов, объявленных с@контроллер и определяет методы с аннотацией аннотации@RequestMapping в них. Мы можем использовать@RequestMapping
в/в только те методы, классы которых аннотированы с контроллером @и это **не** работать с
@компонент,
@обслуживание,
@репозитория` и т. д...<суб>Note: если класс уже зарегистрирована в зернах через любой альтернативный метод, как с помощью
@Бин
или через@компонент
,@
обслуживания и т. д... аннотации, после@RequestMapping
можно получить, если класс является также аннотируются `@RequestMapping аннотации. Но, что'ы по другому сценарию.</суб>@
Обслуживание бобы держать бизнес-логику и способы вызова в репозитории слоя.Что особенного @услугу?
Помимо того, что это's используемый, чтобы указать, что это'ы проведение бизнес-логики, нет ничего заметного в этой аннотации, но кто знает, весной может добавить некоторые дополнительные исключительных в будущем.
Аналогично, в будущем весенне может добавить специальные функции для
@служба
, `контроллер @ " и " @хранилище на основе их наложения конвенций. Следовательно, это's всегда хорошая идея, чтобы соблюдать конвенцию и использовать его в соответствии со слоями.Они почти одинаковы - все они означают, что класс является бобом Spring.
@Service
,@Repository
и@Controller
являются специализированными@Component
. Вы можете выбрать для них определенные действия. Например:@Controller
бобы используются spring-mvc@Repository
могут быть использованы для перевода исключений персистентностиДругое дело, что вы семантически назначаете компоненты различным уровням.
Одно из преимуществ
@Component
заключается в том, что вы можете аннотировать им другие аннотации, а затем использовать их так же, как@Service
.Например, недавно я сделал:
Таким образом, все классы, аннотированные
@ScheduledJob
, являются spring beans и в дополнение к этому регистрируются как кварцевые задания. Вам просто нужно предоставить код, который обрабатывает конкретную аннотацию.@Компонентом является эквивалентом
@Обслуживание, контроллер@, @репозитория = {@компонентов + еще некоторые специальные функции}
Что означает обслуживание, контроллера и хранилища-функционально то же самое.
Три аннотации используются для разделения и"слои" и; в приложении,
Теперь вы можете спросить зачем отделяться от них: (я предполагаю, что вы знаете АОП-аспект ориентированное программирование)
Позвольте'говорят, что вы хотите контролирует деятельность единственного слоя DAO. Вы пишете аспект (класс) класс, который делает некоторые лесозаготовки до и после каждого метод свой Дао вызывается, вы сможете сделать это с помощью АОП, как у вас есть три различных слоях и не смешались.
Так что вы сможете заняться лесозаготовкой Дао, что "вокруг" В, С "до quot и; или "после" по даосской методики. Вы могли бы сделать это, потому что у тебя Дао в первую очередь. То, что вы просто достигли разделение проблемы или задачи.
Представьте, если бы были только одни аннотации контроллер@, то этот компонент будет иметь диспетчеризации, бизнес-логики и доступа к базе данных все смешали, так что грязный код!
Выше один очень распространенный сценарий, есть много случаев использования зачем использовать три Примечания.
Весной
@компонент
,@служба
, `@контроллер " и " @хранилище не стереотип аннотации, которые используются для:@Контроллер:
где ваш запрос сопоставление презентация страницы выполнена, т. е. уровень представления выиграл'т пойти в любой другой файл, он идет прямо на `@контроллер класса и проверяет запрошенный путь в@RequestMapping аннотации, которая написана до вызова метода, если это необходимо.@
Обслуживание: вся бизнес-логика находится здесь, т. е. данные, связанные с расчетами и все.Эта аннотация бизнес-слой, в котором наших пользователей не напрямую вызвать метод упорство, поэтому он будет вызвать этот метод, используя эту аннотацию. Он будет запрашивать @репозитория по просьбе пользователей@Репозитория
: это постоянный слой(слой доступа к данным) применения, которые используются для получения данных из базы данных. т. е. все операции, связанные с базой данных осуществляется в хранилище.@Компонентом
- добавлять другие компоненты (например, классы остальных ресурсов) со стереотипом компонента.ссылка :- Весна документации - сканирование классов, управляемых компонентов и конфигураций письменной форме с использованием Java
Использование аннотаций
@Service
и@Repository
важно с точки зрения подключения к базе данных.@Service
для всех ваших соединений с БД типа веб-сервиса@Repository
для всех соединений с БД типа хранимых процедур.Если вы не используете соответствующие аннотации, вы можете столкнуться с исключениями фиксации, отменяемыми транзакциями отката. Во время нагрузочного теста вы увидите исключения, связанные с откатом транзакций JDBC.
Технически
@контроллер
,@служба
,@репозитория
все же. Все из них распространяется@компонентов
.С весны исходный код:
Указывает, что аннотированный класса А "компонент" по. Такие занятия рассматриваются как кандидаты для автоматического обнаружения при использовании аннотации на основе конфигурации и сканирование классов.
Мы можем напрямую использовать
@компонентов для каждого Bean, но для лучшего понимания и ремонтопригодность большие приложения, мы используем
@контроллер,
@обслуживание,
@репозитория`.Цель каждого аннотация:
@Контроллер
-> классов, объявленных с этим, предназначены для того, чтобы получить запрос со стороны клиента. Первый запрос поступил к диспетчеру сервлета, откуда он передает запрос к контроллеру, используя значениеаннотации@RequestMapping
.@Сервис
-> классы аннотируются в этом, предназначены для манипулирования данными, которые мы получаем от клиента или выборки из базы данных. Все манипуляции с данными должны быть сделаны в этом слое.@Репозитория
-> классы аннотируются в этом, предназначены для соединения с базой данных. Его также можно рассматривать как DAO(объекты доступа к данным) слой. Этот слой должен быть ограничен CRUD (создание, чтение, обновление, удаление) только операции. Если требуются какие-либо манипуляции, данные должны быть посланы отправить обратно в слой @сервисом.Если мы пересадочный свое место(хранилище использовать
@
в местеконтроллер@
), наше приложение будет работать нормально.Основная цель использования трех различных `@аннотации состоит в том, чтобы обеспечить лучшую модульность к корпоративному приложению.
@Репозитория @службой и контроллер @ подают в качестве специализации @компонент для более конкретного использования на этой основе вы можете заменить @услугу @составляющей, но в этом случае вы потеряете специализации.
все эти аннотации типа стерео тип аннотаций,разница между этими тремя аннотации
например
@Service
или@Repositroy
или@контроллер аннотации
по умолчанию `@компонент аннотации собирается существования на высший классПружина обеспечивает четыре различных типов автокомпонентов скан аннотации, они
@компонент
,@служба
,@репозитория
и@контроллер
. Технически, нет никакой разницы между ними, но каждый авто-компонент сканирования аннотации следует использовать с особой целью и в рамках определенного слоя.@Компонент
: она является основным компонентом автоматического сканирования аннотации, это означает, аннотированного класса представляет собой компонент автоматического сканирования.@Контроллер
: аннотированный класса показывает, что это контроллер компонент, и в основном используется на презентации слоя.@
Обслуживание: это означает, аннотированного класса является составной обслуживание в бизнес-слой.@Репозитория
: вы должны использовать эту аннотацию внутри слоя настойчивость, это действует как хранилище базы данных.Следует выбрать более специализированную форму
@компонент
в то время как аннотирование их класса, как эта аннотация может содержать определенное поведение в будущем.Мы можем ответить на это по стандарт Java
Ссылаясь на
спецификации JSR-330
, которая сейчас поддерживается весны, вы можете использовать@с именем
определим объект (как-то@имени=@компонентом
). Так, согласно этому стандарту, есть ощущение, что там нет использовать, чтобы определить стереотипы (например,@репозитория
,@служба
,контроллер@
) в категории фасоль.Но весна пользователей эти различные аннотации в различных для конкретного использования, например:
, они могут быть хорошим кандидатом для
точки`)@Репозитория
аннотаций позволит добавить некоторые функции на свой зерен (некоторые автоматический перевод исключение на вашу настойчивость слой фасоли).@контроллер
.Комментировать другие компоненты с @компонентов, например остальные классы ресурсов.
@Компонент-это общий стереотип для управляемого компонента.
Контроллер@, @обслуживание и @Repository специализации @компонентом для определенных случаев.
@Компонентом весной
Даже если мы пересадочный @компонентов или @репозитория или @сервис
Она будет вести себя так же , но одним из аспектов является то, что они не смогут уловить некоторые специфические исключения, связанные с Дао, а не хранилище, если мы используем компонент или @ сервис
Весной 4, последняя версия:
`@Компонентов на верхнем уровне общих аннотации, что делает аннотированный фасоли должны быть отсканированы и доступны в контейнер
@Репозитория
специализируется аннотации и приносит возможность преобразования все неотмеченные исключения из классов DAO@Сервис
специализируется аннотации. это не приносят никаких новых функций, так, но он проясняет намерения БобаКонтроллер @ - это специализированные аннотации, что делает Боб понимает MVC и позволяет использовать дополнительные аннотации как@RequestMapping и все такое
Вот еще подробности
Нет никакой разницы между @компонентов,@обслуживание, контроллер@,@репозитория. @Компонентом является универсальной аннотации для представления компонент нашей модели MVC. Но там будет несколько компонентов в рамках нашего приложения MVC как компоненты слоя сервиса, настойчивость слой компонентов и уровень представления компонентов. Поэтому, чтобы отличить их весной люди дали другие три аннотации.
Для представления компонентов настойчивости слой : @репозитория
Для представления компонентов слоя сервиса : @Сервис
Представлять презентацию компоненты слоя: контроллер @
или же вы можете использовать @компонентом для всех них.
А
@
обслуживание цитировать весна документации,Если вы посмотрите на дизайн управляемый домен Эрик Эванс,
и
хранилище
, как в Эрик Эванс,> в репозиторий представляет все объекты определенного типа в качестве концептуальной
@Компонентов: вы аннотации @component класс, он говорит гибернации, что это фасоль.
@Репозитория: вы аннотировать класс с @репозиторий, он говорит гибернации это DAO-класс и рассматривать его как DAO-класс. Значит, он делает исключения непроверенные (выкинули из методов Дао) имеют право на перевод в весенний DataAccessException.
@Сервис: это говорит о гибернации это услуга, класс, где у вас будет @транзакций и обслуживания слоем аннотации, так что спящий воспринимает его как компонент сервиса.
Плюс @служба администрации @компонентов. Предположим, имя класса компонента является обслуживание клиентов, поскольку вы не выбирали конфигурации XML как в зернах, так что вы аннотированный фасоли с @компонентом, указывая его в качестве компонента. Поэтому при получении объекта в зернах `обслуживание клиентов каст = (сервисных служб)контексте.getBean (на"Обслуживание клиентов", У); по умолчанию, весна будет нижний регистр первого символа компонента – от ‘обслуживание клиентов’ в ‘приступая к работе’. И вы можете извлечь этот компонент вебсайте с именем‘. Но если вы используете аннотацию @Service для класса компонента, можно указать конкретное имя фасоли
и вы можете получить объект в зернах по
Репозиторий и обслуживания дети компонентный аннотация. Так, все они компонент. Репозиторий и обслуживания просто развернуть его. Как именно? Услуги имеет только идеологическое различие: мы используем его для услуг. Репозиторий особый обработчик исключений.