什么时候在春天使用服务或组件?

Chi*_* wu 10 java spring system-design

什么时候在春天使用服务或组件?

例如,负责将电子邮件或公共业务逻辑发送为"服务"或"组件"的模块是什么?有什么区别?

服务是否能够呼叫其他服务?有交易问题吗?或者服务应该只调用组件?

有人告诉我,服务永远不应该调用其他服务,而应该只调用组件,这意味着Controller-> Service-> Component-> DAO,但是我发现很多人分享了Controller-> Service-> DAO的概念.没有组件.

Spring中是否有关于此主题的系统设计标准?

Pel*_*cho 17

为了"配置"Spring以便它可以为您提供所需类的实例,您应该告诉Spring 涉及哪些对象以及如何构建它们.为此,您可以使用xml配置文件或通过注释

如果你采用注释方法(恕我直言更好,更简单),你可以@Component用来注释类.这就像告诉Spring:"嘿!我想让你知道你可能需要这个类的实例.也许是因为我要求它,也许是因为我要求的东西需要它".所以注释一个类@Component只是让Spring知道它存在

还有其他注释也是如此:

  • @Controller(和@RestController)
  • @Service
  • @Repository

他们都告诉Spring,该课程涉及DI背景.也有语义含义:

  • @Controller= @Component属于表示层
  • @Service= @Component属于服务/用例层
  • @Repository= @Component属于持久层

您可以在此问题中找到更多信息

服务是否应该能够拨打其他服务?

我没有看到任何问题.如果您的任何服务需要执行已由其他人执行的某些操作,您肯定希望避免代码重复.只要您尊重架构层依赖(永不上升),您就可以了.

关于这一点,您可以查看有关Clean Architecture的文章


Rom*_*lov 5

@Component对于其他刻板印象是通用的。
所以你可以替换 @Repository, @Service, @Controller@Component,什么都不会改变。但为了更好的可读性,你应该使用@Repository, @Service, @Controller

  • 不完全正确。`@Repository` 添加了特定于数据库的异常处理。是的,其他注释没有添加任何内容,但这只是时间问题。将来可能会有补充。 (4认同)
  • 有点不正确。@Controller 和@Repository 为类提供了额外的功能,因此我们不能将它们与@Component 互换。Spring将来可能会为@Service添加额外的功能,因此如果您使用@Component,您将错过这些功能。 (2认同)