Для весеннего автоопределения, в чем разница между компонентом и обслуживанием? - PullRequest
7 голосов
/ 19 января 2012

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

Ответы [ 4 ]

4 голосов
/ 19 января 2012

Основное различие между обеими аннотациями состоит в том, что @Service является специализацией @Component.

См. Также пружина Документация для @Service:

Указывает, что аннотированный класс является «Сервисом» (например, бизнес служебный фасад).

Эта аннотация служит специализацией @Component, позволяя классы реализации, которые будут автоматически обнаруживаться при сканировании пути к классам.

Специализация компонента также @Repository и @Controller

Дополнительную информацию можно найти, например, здесь .

2 голосов
/ 19 января 2012

Начиная с версии 3.1, нет никакой разницы в том, как Spring обрабатывает их. Документы говорят это, но довольно неясным образом :

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

Так что на данный момент Spring будет обрабатывать @Service точно так же, как @Component, но @Service можно считать формой документации.

Я не совсем уверен, почему @Service был включен в Spring 2.5 вообще, так как он, кажется, не имеет никакой реальной цели.

0 голосов
/ 31 января 2014

вот объяснение, почему нам нужна такая специализация ...

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

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

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

Таким образом, если вы выбираете между использованием @Component или @Service для своего уровня обслуживания, @Service, безусловно, является лучшим выбором. Аналогично, как указано выше, @Repository уже поддерживается в качестве маркера для автоматического преобразования исключений в вашем слое постоянства.

0 голосов
/ 19 января 2012

проверьте исходный код

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any
     */
    String value() default "";

}

Сервисная аннотация в свою очередь аннотируется @Component.В этом нет особой разницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...