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