和注解可以在 Spring@Component中互换使用,还是它们除了作为注解设备之外还提供任何特定的功能?@Repository@Service
@Component
@Repository
@Service
换句话说,如果我有一个 Service 类并且我将注释从 更改@Service为@Component,它的行为是否仍然相同?
或者注释是否也会影响类的行为和功能?
来自Spring 文档:
@Repository注释是满足存储库(也称为数据访问对象或 DAO)角色或原型的任何类的标记。此标记的用途之一是异常的自动翻译,如Exception Translation中所述。 Spring 提供了更多的原型注解:@Component、@Service和@Controller. @Component是任何 Spring 管理的组件的通用构造型。@Repository, @Service, 和@Controller是@Component针对更具体用例(分别在持久层、服务层和表示层)的特化。因此,您可以使用 注释组件类@Component,但是通过使用 、 注释它们@Repository,@Service或者@Controller 相反,您的类更适合工具处理或与方面关联。 例如,这些原型注释是切入点的理想目标。@Repository, @Service, 并且 @Controller还可以在 Spring 框架的未来版本中携带额外的语义。因此,如果您在使用 @Component或@Service用于您的服务层之间进行选择,@Service显然是更好的选择。同样,如前所述,@Repository已经支持作为持久层中自动异常转换的标记。
@Repository注释是满足存储库(也称为数据访问对象或 DAO)角色或原型的任何类的标记。此标记的用途之一是异常的自动翻译,如Exception Translation中所述。
Spring 提供了更多的原型注解:@Component、@Service和@Controller. @Component是任何 Spring 管理的组件的通用构造型。@Repository, @Service, 和@Controller是@Component针对更具体用例(分别在持久层、服务层和表示层)的特化。因此,您可以使用 注释组件类@Component,但是通过使用 、 注释它们@Repository,@Service或者@Controller 相反,您的类更适合工具处理或与方面关联。
@Controller
例如,这些原型注释是切入点的理想目标。@Repository, @Service, 并且 @Controller还可以在 Spring 框架的未来版本中携带额外的语义。因此,如果您在使用 @Component或@Service用于您的服务层之间进行选择,@Service显然是更好的选择。同样,如前所述,@Repository已经支持作为持久层中自动异常转换的标记。
由于许多答案已经说明了这些注释的用途,因此我们将重点关注它们之间的一些细微差别。
首先是相似度 值得再次强调的第一点是,对于 BeanDefinition 的扫描自动检测和依赖注入,所有这些注释(即,@Component、@Service、@Repository、@Controller)都是相同的。我们可以用一个代替另一个,并且仍然可以解决问题。
首先是相似度
值得再次强调的第一点是,对于 BeanDefinition 的扫描自动检测和依赖注入,所有这些注释(即,@Component、@Service、@Repository、@Controller)都是相同的。我们可以用一个代替另一个,并且仍然可以解决问题。
@零件
这是一个通用的原型注解,表明该类是一个弹簧组件。
*@Component 的特别之处在于* <context:component-scan>只扫描@Component而不寻找@Controller,@Service和@Repository一般情况下。它们被扫描是因为它们本身带有注释@Component。
<context:component-scan>
看看@Controller,@Service和@Repository注释定义:
@Component public @interface Service { …. }
@Component public @interface Repository { …. }
@Component public @interface Controller { … }
因此,说@Controller,@Service和@Repository是特殊类型的@Component注解并没有错。<context:component-scan>拾取它们并将它们的以下类注册为 bean,就像它们被注释一样@Component。
特殊类型的注解也会被扫描,因为它们本身是带有@Component注解的,也就是说它们也是@Components。如果我们定义自己的自定义注解并使用 进行注解@Component,它也会被扫描<context:component-scan>
这是为了表明该类定义了一个数据存储库。
*@Repository 有什么特别之处?*
除了指出这是一个基于 Annotation 的 Configuration之外,它@Repository的工作是捕获特定于平台的异常并将它们作为 Spring 的统一未检查异常之一重新抛出。为此,我们提供了PersistenceExceptionTranslationPostProcessor,我们需要像这样添加到 Spring 的应用程序上下文中:
PersistenceExceptionTranslationPostProcessor
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
这个 bean 后处理器向任何带有注释的 bean 添加了一个顾问,@Repository以便捕获任何特定于平台的异常,然后作为 Spring 的未经检查的数据访问异常之一重新抛出。
@控制器
@Controller注释表明一个特定的类充当控制器的角色。@Controller注释充当被注释类的构造型,指示其角色。
*@Controller 有什么特别之处?*
我们不能用任何其他的类似@Serviceor来切换这个注释@Repository,即使它们看起来一样。调度程序扫描带有注释的类@Controller并检测其中带有@RequestMapping注释的方法。我们只能使用@RequestMappingon/in 那些类被注释的方法,@Controller并且它不能与@Component,@Service等一起使用@Repository......
@RequestMapping
注意:如果一个类已经通过任何替代方法注册为 bean,例如 through@Bean或 through@Component等@Service…注解,则@RequestMapping如果该类也使用注解进行注解,则可以选择该类@RequestMapping。但这是一个不同的场景。
@Bean
@服务
@Service bean 在存储库层中保存业务逻辑和调用方法。
*@Service 有什么特别之处?*
除了它用于指示它持有业务逻辑这一事实之外,此注释中没有其他值得注意的地方;但谁知道呢,Spring 将来可能会添加一些额外的异常。
*还有什么?*
与上面类似@Service,未来 Spring 可能会基于它们的分层约定添加特殊功能。因此,尊重约定并分层使用它始终是一个好主意。@Controller``@Repository
@Controller``@Repository