Для весеннего автоопределения, в чем разница между компонентом и сервисом?
Я думаю, что как @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 уже поддерживается в качестве маркера для автоматической трансляции исключений в вашем слое сохраняемости.