一尘不染

Spring 中的@Component、@Repository 和@Service 注解有什么区别?

javascript

和注解可以在 Spring@Component中互换使用,还是它们除了作为注解设备之外还提供任何特定的功能?@Repository@Service

换句话说,如果我有一个 Service 类并且我将注释从 更改@Service@Component,它的行为是否仍然相同?

或者注释是否也会影响类的行为和功能?


阅读 245

收藏
2022-02-08

共2个答案

一尘不染

来自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已经支持作为持久层中自动异常转换的标记。

注解 意义
@Component 任何 Spring 管理的组件的通用构造型
@Repository 持久层的原型
@Service 服务层的构造型
@Controller 表示层的构造型(spring-mvc)
2022-02-08
一尘不染

由于许多答案已经说明了这些注释的用途,因此我们将重点关注它们之间的一些细微差别。

首先是相似度

值得再次强调的第一点是,对于 BeanDefinition 的扫描自动检测和依赖注入,所有这些注释(即,@Component、@Service、@Repository、@Controller)都是相同的。我们可以用一个代替另一个,并且仍然可以解决问题。


@Component、@Repository、@Controller 和 @Service 之间的区别

@零件

这是一个通用的原型注解,表明该类是一个弹簧组件。

*@Component 的特别之处在于*
<context:component-scan>只扫描@Component而不寻找@Controller,@Service@Repository一般情况下。它们被扫描是因为它们本身带有注释@Component

看看@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

这是为了表明该类定义了一个数据存储库。

*@Repository 有什么特别之处?*

除了指出这是一个基于 Annotation 的 Configuration之外,它@Repository的工作是捕获特定于平台的异常并将它们作为 Spring 的统一未检查异常之一重新抛出。为此,我们提供了PersistenceExceptionTranslationPostProcessor,我们需要像这样添加到 Spring 的应用程序上下文中:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

这个 bean 后处理器向任何带有注释的 bean 添加了一个顾问,@Repository以便捕获任何特定于平台的异常,然后作为 Spring 的未经检查的数据访问异常之一重新抛出。


@控制器

@Controller注释表明一个特定的类充当控制器的角色。@Controller注释充当被注释类的构造型,指示其角色。

*@Controller 有什么特别之处?*

我们不能用任何其他的类似@Serviceor来切换这个注释@Repository,即使它们看起来一样。调度程序扫描带有注释的类@Controller并检测其中带有@RequestMapping注释的方法。我们只能使用@RequestMappingon/in 那些类被注释的方法,@Controller并且它不能@Component,@Service等一起使用@Repository......

注意:如果一个类已经通过任何替代方法注册为 bean,例如 through@Bean或 through@Component@Service…注解,则@RequestMapping如果该类也使用注解进行注解,则可以选择该类@RequestMapping。但这是一个不同的场景。


@服务

@Service bean 在存储库层中保存业务逻辑和调用方法。

*@Service 有什么特别之处?*

除了它用于指示它持有业务逻辑这一事实之外,此注释中没有其他值得注意的地方;但谁知道呢,Spring 将来可能会添加一些额外的异常。


*还有什么?*

与上面类似@Service,未来 Spring 可能会基于它们的分层约定添加特殊功能。因此,尊重约定并分层使用它始终是一个好主意。@Controller``@Repository

2022-02-08