Spring中的@ Component,@ Repository和@Service批注有什么区别?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看活动链接

提问:Spring中的@ Component,@ Repository和@Service批注有什么区别?

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

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

还是注释也会影响类的行为和功能?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

从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)
复制代码

高分回答:

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

首先是相似性

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

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

@成分
复制代码

这是一个通用的构造型注释,指示该类是spring组件。

有什么特别的@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

@epository
复制代码

这表示该类定义了一个数据存储库。

@Repository有什么特别之处?

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

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

@Controller
复制代码

该@Controller注解表明特定类供应控制器的作用。该@Controller注释充当注解类刻板印象,这表明它的作用。

@Controller有什么特别之处?

即使它们看起来相同,我们也无法将其与其他任何类似的@Service或切换@Repository。调度程序将扫描@Controller带有@RequestMapping注释的类,并在其中检测带有注释的方法。我们可以使用@RequestMapping上/只,其类注释与方法@Controller,这将不与工作@Component,@Service,@Repository等…

注意:如果某个类已经通过任何其他方法(例如通过@Bean或通过@Component,@Service等等…注释)注册为Bean ,那么@RequestMapping如果该类也已使用注释进行@RequestMapping注释,则可以选择该类。但这是另一种情况。

@Service
复制代码

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

@Service有什么特别之处?

除了它用来指示它保持业务逻辑这一事实外,此注释中没有其他可注意到的东西。但是谁知道,Spring将来可能会添加一些额外的例外。

还有什么?
复制代码

与上述类似,在Spring将来可能会增加对特殊功能@Service,@Controller并@Repository根据他们的分层约定。因此,尊重约定并与层配合使用始终是一个好主意。

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/6…

作者建议:大相庭径,分层开发

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞? 求关注❤️ 求分享? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享