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

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

4 ответов


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

Смотрите также spring документация на @Service:

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

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

A специализация компонента также является @Repository и a @Controller

дополнительная информация может быть найдена, например здесь.


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

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

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

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


проверяем исходный код

@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 . В этом нет большой разницы .


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

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

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

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

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