В чем разница между аннотациями @Component, @Repository и @Service в Spring?

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

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

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

Комментарии к вопросу (3)

Из Spring Documentation:

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

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

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

Таким образом, если вы выбираете между использованием @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)      │
└────────────┴─────────────────────────────────────────────────────┘
Комментарии (12)

Столько ответов уже, что эти аннотации используются, мы'МР здесь внимание на некоторые незначительные различия между ними.

сначала похожести

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


Различия между @компонентов, @репозитория, контроллер @и @#обслуживание

@составляющей

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

Что особенного @составляющей в <контексте:компонент сканирования и GT; сканирует @составляющую и не искать@контроллер,репозиторий@Serviceи@в целом. Они проверяются, потому что они сами помечаются@компонентов`.

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

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Repository {
    ….
}

 

@Component
public @interface Controller {
    …
}

Таким образом, это не будет неправильным сказать, что @контроллер, @Service и @репозитория специальные типы аннотации @компонентов. в <контексте:компонент сканирования и GT; берет их и регистрирует их следующие сорта фасоли, как если бы они были аннотированы с @компонентов.

Специальный тип аннотации также по этой, потому что они сами с аннотацией аннотации @компонент, что означает, что они также @компонента. Если мы определим наши собственные пользовательские аннотации и аннотировать его с@компонента, он также будет получать по этой С в<контексте:компонент сканирования и GT;`


@репозитория

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

Что особенного @репозиторий?

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

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


контроллер @

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

Что особенного контроллера@?

Мы не можем переключить эту аннотацию с любой другой, Как @эксплуатации " или " @хранилище, даже если они выглядят одинаково. Диспетчер сканирует классов, объявленных с@контроллер и определяет методы с аннотацией аннотации@RequestMapping в них. Мы можем использовать @RequestMapping в/в только те методы, классы которых аннотированы с контроллером @и это **не** работать с@компонент,@обслуживание,@репозитория` и т. д...

<суб>Note: если класс уже зарегистрирована в зернах через любой альтернативный метод, как с помощью @Бин или через @компонент, @ обслуживания и т. д... аннотации, после @RequestMapping можно получить, если класс является также аннотируются `@RequestMapping аннотации. Но, что'ы по другому сценарию.</суб>


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

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

Что особенного @услугу?

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


что еще?

Аналогично, в будущем весенне может добавить специальные функции для @служба, `контроллер @ " и " @хранилище на основе их наложения конвенций. Следовательно, это's всегда хорошая идея, чтобы соблюдать конвенцию и использовать его в соответствии со слоями.

Комментарии (6)

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

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

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

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

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

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

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

Комментарии (3)

@Компонентом является эквивалентом

@Обслуживание, контроллер@, @репозитория = {@компонентов + еще некоторые специальные функции}

Что означает обслуживание, контроллера и хранилища-функционально то же самое.

Три аннотации используются для разделения и"слои&quot и; в приложении,

  • Контроллеры просто делать вещи, как диспетчеризация, экспедирование, вызов методов и т. д.
  • Обслуживания бизнес-логику, расчеты и т. д.
  • Репозитория являются даос (объекты доступа к данным), они получают доступ к базе данных напрямую.

Теперь вы можете спросить зачем отделяться от них: (я предполагаю, что вы знаете АОП-аспект ориентированное программирование)

Позвольте'говорят, что вы хотите контролирует деятельность единственного слоя DAO. Вы пишете аспект (класс) класс, который делает некоторые лесозаготовки до и после каждого метод свой Дао вызывается, вы сможете сделать это с помощью АОП, как у вас есть три различных слоях и не смешались.

Так что вы сможете заняться лесозаготовкой Дао, что "вокруг" В, С "до quot и; или "после" по даосской методики. Вы могли бы сделать это, потому что у тебя Дао в первую очередь. То, что вы просто достигли разделение проблемы или задачи.

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

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

Комментарии (4)

Весной @компонент, @служба, `@контроллер " и " @хранилище не стереотип аннотации, которые используются для:

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

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

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

@Компонентом - добавлять другие компоненты (например, классы остальных ресурсов) со стереотипом компонента.

указывает, что аннотированный класс и запах мяты;компонент&;. Такие классы рассматриваются как кандидаты для автоматического обнаружения при использовании В аннотации на основе конфигурации и classpath сканирования.

другой класс-уровень аннотации может рассматриваться как определение компонент также, как правило, особого рода компонентов: например, аннотацию @repository или в AspectJ'ы @аспекте аннотация.

Комментарии (7)

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

@компонент – указывает на компонент автоматического сканирования. @Репозиторий – указывает компонент DAO в уровне устойчивости. @Сервисом – указывает на компонент обслуживания в бизнес-слой. Контроллер @ – указывает на компонент контроллера в презентации слоя.

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

Комментарии (0)

Использование аннотаций @Service и @Repository важно с точки зрения подключения к базе данных.

  1. Используйте @Service для всех ваших соединений с БД типа веб-сервиса
  2. Используйте @Repository для всех соединений с БД типа хранимых процедур.

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

Комментарии (2)

Технически @контроллер, @служба, @репозитория все же. Все из них распространяется @компонентов.

С весны исходный код:

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

Мы можем напрямую использовать @компонентов для каждого Bean, но для лучшего понимания и ремонтопригодность большие приложения, мы используем@контроллер,@обслуживание,@репозитория`.

Цель каждого аннотация:

  1. @Контроллер -> классов, объявленных с этим, предназначены для того, чтобы получить запрос со стороны клиента. Первый запрос поступил к диспетчеру сервлета, откуда он передает запрос к контроллеру, используя значение аннотации@RequestMapping.
  2. @Сервис -> классы аннотируются в этом, предназначены для манипулирования данными, которые мы получаем от клиента или выборки из базы данных. Все манипуляции с данными должны быть сделаны в этом слое.
  3. @Репозитория -> классы аннотируются в этом, предназначены для соединения с базой данных. Его также можно рассматривать как DAO(объекты доступа к данным) слой. Этот слой должен быть ограничен CRUD (создание, чтение, обновление, удаление) только операции. Если требуются какие-либо манипуляции, данные должны быть посланы отправить обратно в слой @сервисом.

Если мы пересадочный свое место(хранилище использовать @ в месте контроллер@), наше приложение будет работать нормально.

Основная цель использования трех различных `@аннотации состоит в том, чтобы обеспечить лучшую модульность к корпоративному приложению.

Комментарии (1)

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

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.
Комментарии (0)

все эти аннотации типа стерео тип аннотаций,разница между этими тремя аннотации

  • если мы добавим @компонента, то это говорит о роли классов является компонентом класса это означает, что класс, состоящий какая-то логика,но это не сказать ли класс, содержащий конкретно бизнесу или настойчивость или логики контроллера, так что мы не'т использовать напрямую этот аннотацию @component
  • если добавить @услуги по аннотации, то это говорит о том, что роль класса в составе бизнес-логики
  • если добавить @репозиторий на верхней части класса, то это говорит, что класс, состоящий сохранением логики
  • здесь @компонентом является база аннотаций на @службу,@Repository и @контроллер аннотации

например

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • когда мы добавляет @Service или @Repositroy или @контроллер аннотации по умолчанию `@компонент аннотации собирается существования на высший класс
Комментарии (0)

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

@Компонент: она является основным компонентом автоматического сканирования аннотации, это означает, аннотированного класса представляет собой компонент автоматического сканирования.

@Контроллер: аннотированный класса показывает, что это контроллер компонент, и в основном используется на презентации слоя.

@ Обслуживание: это означает, аннотированного класса является составной обслуживание в бизнес-слой.

@Репозитория: вы должны использовать эту аннотацию внутри слоя настойчивость, это действует как хранилище базы данных.

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

Комментарии (0)

Мы можем ответить на это по стандарт Java

Ссылаясь на спецификации JSR-330, которая сейчас поддерживается весны, вы можете использовать @с именем определим объект (как-то @имени=@компонентом). Так, согласно этому стандарту, есть ощущение, что там нет использовать, чтобы определить стереотипы (например, @репозитория, @служба, контроллер@) в категории фасоль.

Но весна пользователей эти различные аннотации в различных для конкретного использования, например:

  1. Разработчики помогите определить лучшую категорию для компетентного. Такая группировка может стать полезным в некоторых случаях. (Например, при использовании аспектно-ориентированного, они могут быть хорошим кандидатом дляточки`)
  2. @Репозитория аннотаций позволит добавить некоторые функции на свой зерен (некоторые автоматический перевод исключение на вашу настойчивость слой фасоли).
  3. Если вы используете весна в MVC, в@RequestMapping могут только быть добавлены к классам, которые аннотируются @контроллер.
Комментарии (1)

Комментировать другие компоненты с @компонентов, например остальные классы ресурсов.

@Component
public class AdressComp{
    .......
    ...//some code here    
}

@Компонент-это общий стереотип для управляемого компонента.

Контроллер@, @обслуживание и @Repository специализации @компонентом для определенных случаев.

@Компонентом весной

Комментарии (0)

Даже если мы пересадочный @компонентов или @репозитория или @сервис

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

Комментарии (0)

Весной 4, последняя версия:

в аннотацию @repository-это маркер на любой класс, который выполняет роль и стереотип репозиторий (также известный как доступ к данным объекта или DAO). Среди использования данного маркера является автоматический перевод исключения, как описано в разделе 20.2.2, “ошибка перевода”.

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

Комментарии (0)

`@Компонентов на верхнем уровне общих аннотации, что делает аннотированный фасоли должны быть отсканированы и доступны в контейнер

@Репозитория специализируется аннотации и приносит возможность преобразования все неотмеченные исключения из классов DAO

@Сервис специализируется аннотации. это не приносят никаких новых функций, так, но он проясняет намерения Боба

Контроллер @ - это специализированные аннотации, что делает Боб понимает MVC и позволяет использовать дополнительные аннотации как@RequestMapping и все такое

Вот еще подробности

Комментарии (0)

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

Для представления компонентов настойчивости слой : @репозитория

Для представления компонентов слоя сервиса : @Сервис

Представлять презентацию компоненты слоя: контроллер @

или же вы можете использовать @компонентом для всех них.

Комментарии (0)

А @ обслуживание цитировать весна документации,

указывает, что аннотированный класса А "Служба", изначально определен по предметно-ориентированное проектирование (Эванс, 2003) как "работа, предлагаемых в качестве интерфейс, который стоит только в модели, не капсулированный.&и" также может означать, что класс А "Бизнес фасад Сервис" (в основные модели в J2EE смысле), или что-то подобное. Эта аннотация представляет собой общего назначения стереотип и отдельных команд может сужать их семантика и использовать по мере необходимости.

Если вы посмотрите на дизайн управляемый домен Эрик Эванс,

услуга-это операция предложена как интерфейс, который стоит особняком в модель, без инкапсуляции государства, в виде сущностей и объектов-значений сделать. Сервисы общий шаблон технической рамки, но они можно также применять в слое домена. Служба имен подчеркивает отношения с другими объектами. В отличие от сущностей и объектов значения, это определяется исключительно в терминах того, что он может сделать для клиента. УСЛУГИ стремится быть названы действия, а не субъект—глагол, а В чем существительное. А сервис все равно можете иметь абстрактный, умышленное По определению, она просто имеет другой вкус, чем определение объект. Служба должна все-таки иметь определенную ответственность, и что ответственность и интерфейс его исполнения должен быть определен как В рамках модели предметной области. Имена операций должны исходить от вездесущий язык или быть введены в него. Параметры и результаты должны быть объектами домена. Услуги должны быть использоваться разумно и не допускается прокладка субъектов и объектов стоимость всех своим поведением. но когда операция является на самом деле важным понятием домена формы обслуживания естественной частью управляемой моделями разработки. Объявлен в модель в качестве сервиса, а не как трепло объект, который не'т на самом деле ничего из себя представляете, автономная работа не вводить в заблуждение По-любому.

и хранилище, как в Эрик Эванс,

> в репозиторий представляет все объекты определенного типа в качестве концептуальной

набор (обычно эмулируется). Он действует как сбор, за исключением более разработать возможности построения запросов. Объекты соответствующего типа, добавлены и удалены, и машин за хранилище вставками их или удаляет их из базы данных. Это определение объединяет связный набор обязанностей для обеспечения доступа к корням агрегаты с раннего жизненный цикл до конца.

Комментарии (0)

@Компонентов: вы аннотации @component класс, он говорит гибернации, что это фасоль.

@Репозитория: вы аннотировать класс с @репозиторий, он говорит гибернации это DAO-класс и рассматривать его как DAO-класс. Значит, он делает исключения непроверенные (выкинули из методов Дао) имеют право на перевод в весенний DataAccessException.

@Сервис: это говорит о гибернации это услуга, класс, где у вас будет @транзакций и обслуживания слоем аннотации, так что спящий воспринимает его как компонент сервиса.

Плюс @служба администрации @компонентов. Предположим, имя класса компонента является обслуживание клиентов, поскольку вы не выбирали конфигурации XML как в зернах, так что вы аннотированный фасоли с @компонентом, указывая его в качестве компонента. Поэтому при получении объекта в зернах `обслуживание клиентов каст = (сервисных служб)контексте.getBean (на"Обслуживание клиентов", У); по умолчанию, весна будет нижний регистр первого символа компонента – от ‘обслуживание клиентов’ в ‘приступая к работе’. И вы можете извлечь этот компонент вебсайте с именем‘. Но если вы используете аннотацию @Service для класса компонента, можно указать конкретное имя фасоли

@Service("AAA")
public class CustomerService{

и вы можете получить объект в зернах по

CustomerService cust = (CustomerService)context.getBean("AAA");
Комментарии (0)

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

Комментарии (0)