Может @Component
, @Repository
и @Service
аннотаций быть использованы взаимозаменяемо весной или же они обеспечивают какой - либо конкретной функции , кроме действующих в качестве обозначения устройства?
Другими словами, если у меня есть класс Service, и я меняю аннотацию с @Service
на @Component
, будет ли он все равно вести себя так же?
Или аннотация также влияет на поведение и функциональность класса?
java
spring
spring-mvc
annotations
Колин МакКри
источник
источник
Ответы:
Из весенней документации :
источник
@Service
как, также является@Component
(потому что@Service
сама аннотация помечена как@Component
). Насколько я знаю, ничто в среде Spring явно не использует тот факт, что что-то есть@Service
, поэтому разница действительно только концептуальная.Поскольку во многих ответах уже указано, для чего используются эти аннотации, мы сосредоточимся здесь на некоторых незначительных различиях между ними.
Различия между @Component, @Repository, @Controller и @Service
Это универсальная аннотация стереотипа, указывающая, что класс является компонентом Spring.
Что особенного в @Component
<context:component-scan>
только сканирует@Component
и не ищет@Controller
,@Service
и@Repository
вообще. Они сканируются, потому что сами помечены@Component
.Просто взгляните на
@Controller
,@Service
и@Repository
определение аннотаций:Таким образом, это не неправильно, чтобы сказать
@Controller
,@Service
и@Repository
это особые типы@Component
аннотаций.<context:component-scan>
подбирает их и регистрирует их следующие классы как бины, как если бы они были помечены@Component
.Аннотации специального типа также сканируются, потому что они сами помечены
@Component
аннотацией, что означает, что они также являются@Component
s. Если мы определим нашу собственную пользовательскую аннотацию и аннотируем ее@Component
, она также будет отсканирована с<context:component-scan>
Это указывает на то, что класс определяет хранилище данных.
Что особенного в @Repository?
В дополнение к указанию, что это конфигурация на основе аннотаций ,
@Repository
задача состоит в том, чтобы перехватывать специфичные для платформы исключения и повторно выдавать их как одно из унифицированных непроверенных исключений Spring. Для этогоPersistenceExceptionTranslationPostProcessor
мы получили то, что нам необходимо добавить в контекст приложения Spring, например:Этот постпроцессор bean добавляет советник для любого bean-компонента, аннотированного
@Repository
так, что любые специфичные для платформы исключения перехватываются, а затем повторно генерируются как одно из непроверенных исключений доступа к данным Spring.@Controller
Аннотации указывает на то, что конкретный класс играет роль контроллера.@Controller
Аннотацию выступает в качестве стереотипа для аннотированный класса, что указывает на его роль.Что особенного в @Controller?
Мы не можем поменять эту аннотацию на любую другую, как
@Service
или@Repository
, даже если они выглядят одинаково. Диспетчер просматривает аннотированные классы@Controller
и обнаруживает методы, аннотированные@RequestMapping
аннотациями внутри них. Мы можем использовать@RequestMapping
в / в только те методы, чьи классы аннотированы,@Controller
и они НЕ будут работать@Component
,@Service
и@Repository
т. Д ...Примечание: Если класс уже зарегистрирован как боб через любой альтернативный способ, как через
@Bean
или с помощью@Component
, и@Service
т.д. ... аннотаций, то@RequestMapping
может быть выбран , если класс также с аннотацией@RequestMapping
аннотацию. Но это другой сценарий.@Service
bean-компоненты содержат бизнес-логику и вызывают методы на уровне хранилища.Что особенного в @Service?
Помимо того, что он используется для обозначения того, что он содержит бизнес-логику, в этой аннотации нет ничего более заметного; но кто знает, весна может добавить некоторые дополнительные исключительные в будущем.
Подобно выше, в будущем Spring может добавлять специальные функциональные возможности для
@Service
,@Controller
и на@Repository
основе их облицовочных конвенций. Следовательно, всегда полезно соблюдать соглашение и использовать его в соответствии со слоями.источник
@Controller
аннотации. Это не требуется, если класс аннотирован@RequestMapping
и боб этого класса создан каким-либо образом. Любой компонент, помеченный@Controller
OR,@RequestMapping
будет участвовать в отображениях запросов Spring MVC. Это может быть полезно, например, для создания контроллеров программно (например, с использованием@Bean
методов) и в то же время для предотвращения попыток Spring создать их посредством сканирования пакетов (если пакет не может быть исключен из сканирования).Они почти одинаковы - все они означают, что класс - это Spring bean.
@Service
,@Repository
И@Controller
специализированы@Component
с. Вы можете выполнить определенные действия с ними. Например:@Controller
бобы используются весной-MVC@Repository
бобы имеют право на постоянный перевод исключенияДругое дело, что вы семантически назначаете компоненты разным слоям.
Одна вещь, которая
@Component
предлагает это то, что вы можете аннотировать другие аннотации с ней, а затем использовать их так же, как@Service
.Например недавно я сделал:
Таким образом, все классы с пометкой
@ScheduledJob
являются пружинными бобами и в дополнение к этому зарегистрированы как кварцевые задания. Вам просто нужно предоставить код, который обрабатывает конкретную аннотацию.источник
@Component эквивалентно
@Service, @Controller, @Repository = {@Component + еще несколько специальных функций}
Это означает, что Сервис, Контроллер и Репозиторий функционально одинаковы.
Три аннотации используются для разделения «слоев» в вашем приложении,
Теперь вы можете спросить, зачем их разделять: (я полагаю, вы знаете AOP-ориентированное программирование)
Допустим, вы хотите отслеживать активность только на уровне DAO. Вы напишете класс Aspect (A class), который выполняет некоторую регистрацию до и после вызова каждого метода вашего DAO, вы можете сделать это с помощью AOP, поскольку у вас есть три различных уровня и они не смешаны.
Таким образом, вы можете вести протокол DAO «вокруг», «до» или «после» методов DAO. Вы могли бы сделать это, потому что у вас был DAO в первую очередь. То, что вы только что достигли, это разделение проблем или задач.
Представьте, что если бы была только одна аннотация @Controller, то этот компонент будет иметь смешанную, так грязную программу диспетчеризации, бизнес-логики и доступа к базе данных!
Выше упоминался один очень распространенный сценарий, есть еще много вариантов использования трех аннотаций.
источник
@Respository
также есть функция автоматического перевода исключений. Например, когда возникает исключение в a,@Repository
для этого исключения обычно есть обработчик, и нет необходимости добавлять блоки try catch в класс DAO. Он используется вместе с PersistenceExceptionTranslationPostProcessorВесной
@Component
,@Service
,@Controller
и@Repository
являются Стереотипными аннотации , которые используются для:@Controller:
где сопоставление вашего запроса со страницы презентации выполнено, т.е. слой представления не переходит в какой-либо другой файл, он идет непосредственно в@Controller
класс и проверяет запрошенный путь в@RequestMapping
аннотации, записанной перед вызовом метода, если это необходимо.@Service
Вся бизнес-логика здесь, т.е. расчеты, связанные с данными, и все. Это аннотация бизнес-уровня, в которой наш пользователь не вызывает метод постоянного хранения, поэтому он вызывает этот метод с помощью этой аннотации. Он будет запрашивать @Repository согласно запросу пользователя@Repository
Это постоянный уровень (Data Access Layer) приложения, который используется для получения данных из базы данных. т.е. все операции с базой данных выполняются хранилищем.@Component
- Аннотируйте свои другие компоненты (например, классы ресурсов REST) со стереотипом компонента.источник
ссылка: - Spring Documentation - Сканирование пути к классам, управляемые компоненты и написание конфигураций с использованием Java
источник
Технически
@Controller
,@Service
,@Repository
все же. Все они расширяются@Component
.Из исходного кода Spring:
Указывает, что аннотированный класс является «компонентом». Такие классы рассматриваются как кандидаты для автоматического обнаружения при использовании конфигурации на основе аннотаций и сканирования пути к классам.
Мы можем непосредственно использовать
@Component
для всех и каждого бина, но для лучшего понимания и ремонтопригодности большого приложения, мы используем@Controller
,@Service
,@Repository
.Назначение каждой аннотации:
@Controller
-> Классы, аннотированные этим, предназначены для получения запроса со стороны клиента. Первый запрос поступает в сервлет Dispatcher, откуда он передает запрос конкретному контроллеру, используя значение@RequestMapping
аннотации.@Service
-> Классы, помеченные этим, предназначены для манипулирования данными, которые мы получаем от клиента или выбираем из базы данных. Все манипуляции с данными должны быть выполнены в этом слое.@Repository
-> Классы, помеченные этим, предназначены для соединения с базой данных. Его также можно рассматривать как уровень DAO (объекта доступа к данным). Этот уровень должен быть ограничен только операциями CRUD (создание, получение, обновление, удаление). Если требуются какие-либо манипуляции, данные должны быть отправлены обратно на уровень @Service.Если мы поменяемся местами (используем
@Repository
вместо@Controller
), наше приложение будет работать нормально.Основная цель использования трех разных типов
@annotations
- обеспечить лучшую модульность приложения Enterprise.источник
controller and repository
Использование
@Service
и@Repository
аннотации важны с точки зрения подключения к базе данных.@Service
для всех ваших веб-сервисов тип подключения к БД@Repository
для всех ваших соединений с БД procЕсли вы не используете надлежащие аннотации, вы можете столкнуться с исключениями коммитов, переопределенными транзакциями отката. Во время стресс-нагрузочного тестирования вы увидите исключения, связанные с откатом транзакций JDBC.
источник
@Repository
специально предназначен для работы с постоянным слоем. Если вы работаете с rest api - вы работаете с DTO, а не с DAO.@Repository @Service и @Controller служат специализацией @Component для более конкретного использования. На этом основании вы можете заменить @Service на @Component, но в этом случае вы потеряете специализацию.
источник
все эти аннотации являются типом аннотации типа стерео, разница между этими тремя аннотациями
например
@Service
или@Repositroy
или@Controller
по умолчанию,@Component
аннотация собирается существовать поверх классаисточник
Spring предоставляет четыре различных типа автокомпонентов аннотациями сканирования, они
@Component
,@Service
,@Repository
и@Controller
. Технически, между ними нет никакой разницы, но каждую аннотацию автоматического сканирования компонентов следует использовать для специальных целей и в пределах определенного слоя.@Component
: Это базовая аннотация автоматического сканирования компонентов, она указывает, что аннотированный класс является компонентом автоматического сканирования.@Controller
Аннотированный класс указывает, что он является компонентом контроллера и в основном используется на уровне представления.@Service
Указывает, что аннотированный класс является компонентом Service на бизнес-уровне.@Repository
: Вам нужно использовать эту аннотацию в слое постоянства, это действует как хранилище базы данных.Нужно выбрать более специализированную форму
@Component
аннотирования своего класса, так как эта аннотация может содержать определенное поведение в будущем.источник
Мы можем ответить на это в соответствии со стандартом Java
Ссылаясь на то
JSR-330
, что теперь поддерживается Spring, вы можете использовать только@Named
для определения bean (Как-то@Named=@Component
). Итак , в соответствии с этим стандартом, кажется , что нет никакого смысла для определения стереотипов (как@Repository
,@Service
,@Controller
) в категорию фасоль.Но весной пользователь эти разные аннотации по-разному для конкретного использования, например:
aspect-oriented
, они могут быть хорошим кандидатом дляpointcuts
)@Repository
аннотация добавит некоторую функциональность вашему бину (некоторая автоматическая трансляция исключений для вашего уровня персистентности бина).@RequestMapping
может быть добавлен только к тем классам, которые помечены@Controller
.источник
Аннотируйте другие компоненты с помощью @Component, например, классы REST Resource.
@Component - это общий стереотип для любого управляемого компонента Spring.
@Controller, @Service и @Repository являются специализациями @Component для конкретных случаев использования.
@ Компонент весной
источник
Там нет никакой разницы между
@Component
,@Service
,@Controller
,@Repository
.@Component
является общей аннотацией для представления компонента нашего MVC. Но в составе нашего приложения MVC будет несколько компонентов, таких как компоненты уровня обслуживания, компоненты уровня постоянства и компоненты уровня представления. Таким образом, чтобы дифференцировать их, Весенние люди дали и другие три аннотации.@Repository
@Service
@Controller
@Component
для всех них.источник
Даже если мы обмениваемся @Component или @Repository или @service
Он будет вести себя так же, но один из аспектов заключается в том, что они не смогут перехватить какое-то конкретное исключение, связанное с DAO, вместо репозитория, если мы используем компонент или @ service
источник
Весной 4 последняя версия:
источник
@Component : вы комментируете класс
@Component
, он сообщает hibernate, что это Бин.@Repository : вы аннотируете класс
@Repository
, он сообщает hibernate, что это класс DAO, и обрабатывает его как класс DAO. Это означает, что непроверенные исключения (созданные из методов DAO) могут быть переведены в SpringDataAccessException
.@Service : это говорит hibernate, что это класс Service, где у вас будут
@Transactional
аннотации уровня службы и т. Д., Поэтому hibernate рассматривает его как компонент Service.Плюс
@Service
это продвижение@Component
. Предположим, что имя класса bean-компонента являетсяCustomerService
таковым, поскольку вы не выбрали способ конфигурации bean-компонента XML, поэтому вы пометили bean-компонент,@Component
чтобы указать его как Bean- компонент . Таким образом, при получении объекта beanCustomerService cust = (CustomerService)context.getBean("customerService");
По умолчанию Spring будет нижний регистр первого символа компонента - от CustomerService до customerService. И вы можете получить этот компонент с именем 'customerService'. Но если вы используете@Service
аннотацию для класса компонента, вы можете указать конкретное имя компонента:и вы можете получить объект боба
источник
@Component
является общей аннотацией верхнего уровня, которая делает аннотированный бин сканируемым и доступным в контейнере DI@Repository
является специализированной аннотацией и предоставляет возможность преобразования всех непроверенных исключений из классов DAO@Service
это специализированная аннотация. это не приносит никакой новой функции на данный момент, но это проясняет намерение бина@Controller - это специализированная аннотация, которая информирует MVC о компоненте и позволяет использовать дополнительную аннотацию, как
@RequestMapping
и всеВот больше подробностей
источник
А
@Service
процитировать весеннюю документацию,Если вы посмотрите на дизайн, управляемый доменом Эрика Эванса,
и
Repository
в соответствии с Эриком Эвансом,источник
Здесь достаточно хороших ответов, чтобы объяснить аннотации «что такое разница между компонентами репозитория, службы». Я хотел бы поделиться разницей между
@Controller & @RestController
@Controller
противRestController
@RestController
:@Controller
которая добавляет@Controller
и@ResponseBody
аннотации автоматически. поэтому нам не нужно добавлять@ResponseBody
в наши методы отображения. Это означает,@ResponseBody
что по умолчанию активен.@RestController
вы не можете вернуть представление (с помощьюViewresolver
Spring / Spring-Boot)@RestController
также преобразует ответ вJSON/XML automatically
as@ResponseBody
делает возвращаемые объекты в то, что может быть в теле,e.g. JSON or XML
@Controller
@Controller
используется для обозначения классов как Spring MVC Controller. Эта аннотация является просто специализированной версией@Component
и позволяет автоматически определять классы контроллера на основе сканирования пути к классам.@Controller
Вы можете вернуть представление в Spring Web MVC.Более подробный вид
источник
Репозиторий и Сервис являются дочерними компонентами аннотации Компонента . Итак, все они являются Компонентом . Репозиторий и Сервис просто расширяют его. Как именно? Сервис имеет только идеологическую разницу: мы используем его для сервисов. Репозиторий имеет особый обработчик исключений.
источник
Объяснение стереотипов:
@Service
- Аннотируйте все свои классы обслуживания с @Service. Этот слой знает единицу работы. Вся ваша бизнес-логика будет в классах обслуживания. Как правило, методы уровня обслуживания охватываются транзакцией. Вы можете сделать несколько вызовов DAO из метода сервиса, если одна транзакция не удалась, все транзакции должны быть откатаны.@Repository
- Аннотируйте все ваши классы DAO с помощью @Repository. Вся логика доступа к вашей базе данных должна быть в классах DAO.@Component
- Аннотируйте ваши другие компоненты (например, классы ресурсов REST) со стереотипом компонента.@Autowired
- Позвольте Spring автоматически подключать другие bean-компоненты к вашим классам, используя аннотацию @Autowired.@Component
является общим стереотипом для любого компонента, управляемого Spring.@Repository
,@Service
и@Controller
являются специализациями@Component
для более конкретных случаев использования, например, на уровнях постоянства, обслуживания и представления соответственно.Первоначально ответил здесь .
источник
Разница между аннотациями @Component, @Repository, @Controller и @Service
@Controller
= @Component (Внутренняя аннотация) + Свойства уровня презентации@Service
= @Component (Внутренняя аннотация) + Функции сервисного уровня@Component
= Актуальные компоненты (компоненты)@Repository
= @Component (Внутренняя аннотация) + Функции уровня данных (используются для обработки доменных компонентов)источник
В фреймворке Spring предусмотрены некоторые особые типы аннотаций, которые называются аннотациями стереотипов. Это следующие: -
вышеуказанные аннотации являются особыми, потому что когда мы добавляем
<context:component-scan>
в файл xxx-servlet.xml, Spring автоматически создает объект тех классов, которые аннотируются вышеуказанной аннотацией на этапе создания / загрузки контекста.источник
@Component
,@ Repository
,@ Service
,@Controller
:@Component
это общий стереотип для компонентов , управляемых Spring@Repository
,@Service
и@Controller
являются@Component
специализациями для более конкретных целей:@Repository
для настойчивости@Service
за услуги и транзакции@Controller
для контроллеров MVCЗачем использовать
@Repository
,@Service
,@Controller
более@Component
? Мы можем пометить наши классы компонентов с помощью @Component, но если вместо этого мы используем альтернативу, которая адаптируется к ожидаемой функциональности. Наши классы лучше подходят для функциональности, ожидаемой в каждом конкретном случае.Класс, аннотированный с помощью,
@Repository
имеет лучший перевод и удобочитаемую обработку ошибок с помощью org.springframework.dao.DataAccessException. Идеально подходит для реализации компонентов, которые обращаются к данным (DataAccessObject или DAO).Аннотированный класс с
@Controller
играет роль контроллера в приложении Spring Web MVCАннотированный класс с
@Service
играет роль в сервисах бизнес-логики, например шаблон Facade для DAO Manager (Facade) и обработка транзакцийисточник
Ответы, представленные здесь, в основном технически правильны, но, хотя список ответов длинный, и он будет в самом низу, я подумал, что здесь тоже стоит поставить действительно правильный ответ, на тот случай, если кто-то наткнется на него и узнает что-то ценное из Это. Дело не в том, что остальные ответы неверны, просто они не правы. И, чтобы остановить орды троллей, да, я знаю, что технически эти аннотации фактически одинаковы и взаимозаменяемы даже до весны 5. Теперь, для правильного ответа:
Эти три аннотации совершенно разные вещи и не являются взаимозаменяемыми. Вы можете сказать это, потому что их три, а не один. Они не предназначены для взаимозаменяемости, они просто реализованы таким образом, что изящество и удобство.
Современное программирование - это изобретение, искусство, техника и коммуникация в разных пропорциях. Бит связи обычно очень важен, потому что код обычно читается гораздо чаще, чем пишется. Как программист, вы не только пытаетесь решить техническую проблему, но и сообщаете о своих намерениях будущим программистам, которые читают ваш код. Эти программисты не могут делиться ни вашим родным языком, ни вашей социальной средой, и возможно, что они будут читать ваш код в будущем через 50 лет (это не так маловероятно, как вы думаете). Трудно эффективно общаться так далеко в будущем. Поэтому крайне важно, чтобы мы использовали самый ясный, самый эффективный, правильный и общительный язык, доступный нам.
Например, жизненно важно то, что
@Repository
используется, когда мы пишем репозиторий, а не@Component
. Последнее - очень плохой выбор аннотации для репозитория, потому что это не означает, что мы смотрим на репозиторий. Мы можем предположить, что репозиторий также является подпружиненным компонентом, но не компонент является репозиторием. С@Repository
нами ведется ясность и конкретность в нашем языке. Мы четко заявляем, что это хранилище. С@Component
мы оставляем читателю самим решать, какой тип компонента он читает, и им придется читать весь класс (и, возможно, дерево подклассов и интерфейсов), чтобы определить значение. Возможно, читатель в далеком будущем может неверно истолковать класс как не являющийся репозиторием, и мы были бы частично ответственны за эту ошибку, потому что мы, прекрасно понимавшие, что это репозиторий, не смогли конкретизировать наш язык и эффективно сообщать о наших намерениях.Я не буду вдаваться в другие примеры, но изложу настолько четко, насколько смогу: эти аннотации являются совершенно разными вещами и должны использоваться соответствующим образом в соответствии с их намерением.
@Repository
предназначен для хранилищ данных, и никакие другие аннотации не являются правильными.@Service
для услуг, и никакая другая аннотация не является правильной.@Component
для компонентов, которые не являются ни репозиториями, ни сервисами, и использование любого из них на его месте также было бы неправильным. Он может скомпилироваться, может даже запустить и пройти ваши тесты, но это будет неправильно, и я буду думать о вас меньше (профессионально), если вы сделаете это.Есть примеры этого всю весну (и программирование в целом). Вы не должны использовать
@Controller
при написании REST API, потому что@RestController
доступно. Вы не должны использовать,@RequestMapping
когда@GetMapping
является допустимой альтернативой. И т. Д. И т. Д. Вы должны выбрать наиболее конкретный точный и правильный язык, которым вы можете сообщить о своих намерениях своим читателям, в противном случае вы вводите риски в свою систему, и риск имеет свою цену.источник
Чтобы упростить эту иллюстрацию, давайте рассмотрим техническую специфику в зависимости от случая использования. Эти аннотации используются для инъекции, и, как я сказал буквально « Используется для инъекции », это означает, что если вы знаете, как использовать Dependency Injection «DI», и вы Если вы всегда будете искать эти аннотации, и, аннотируя классы этими стерео-типами , вы сообщаете контейнеру DI о необходимости сканировать их, чтобы они были готовы к инъекции в других местах, это практическая цель.
Теперь давайте перейдем к каждому; first @Service , если вы создаете некоторую логику для конкретного бизнес-кейса, вам нужно отделить ее в месте, где будет содержаться ваша бизнес-логика, этот сервис является обычным классом или вы можете использовать его как интерфейс, если хотите, и он написан так это
Все они одинаковы, когда вы внедряете их, @Repository - это интерфейс, который применяет реализацию шаблона проектирования Repository Pattern Repository , обычно он используется, когда вы имеете дело с каким-то хранилищем данных или базой данных, и вы обнаружите, что он содержит несколько готовая реализация для обработки операций с базой данных; это может быть CrudRepository , JpaRepository и т. д.
Наконец, @Component , это обобщенная форма для зарегистрированных bean-компонентов в Spring, то есть весна всегда ищет bean-компонент, отмеченный @Component, для регистрации, тогда и @Service, и @Repository являются особыми случаями @Component, однако это общий случай использования. Компонент - это когда вы делаете что-то чисто техническое, а не прямое экономическое обоснование! как форматирование дат или передача специального механизма сериализации запросов и так далее.
источник
@Component действует как аннотация @Bean в классе конфигурации, регистрирует bean в контексте весны. Также он является родительским для аннотаций @Service, @Repository и @Controller.
@Service , расширяет аннотацию @Component и имеет только разницу в именах.
@Repository - расширяет аннотацию @Component и переводит все исключения базы данных в DataAccessException .
@Controller - действует как контроллер в шаблоне MVC. Диспетчер будет сканировать такие аннотированные классы для сопоставленных методов, обнаруживая аннотации @RequestMapping.
источник
Все это аннотации StereoType. Они полезны для создания наших классов как бобов Spring в контейнере ioc,
источник