避免服务类之间的紧密耦合

时间:2012-10-17 20:47:56

标签: java spring spring-mvc soa

假设我有2个服务类:

UserService
ProductService

如果在我的ProductService类中注入UserService,那是不是错误?

public class ProductserviceImpl implements ProductService {


  @Autowired
  UserService userService;


  @Override
  public void someThing() {
      ..
      userService.otherThing(..);
      ..
  }

}

我知道作为替代我可以创建另一个注入UserService和ProductService的类,但是为这个类提供一个名称非常棘手:)这些类型的名称是否有名称? SOA世界中的类?

5 个答案:

答案 0 :(得分:2)

1)如果在我的ProductService类中注入UserService,那是不是错误?

这本身没有任何问题,但有以下警告:

  • 请注意,您可能会朝着一个班级做太多的方向前进(此处为ProductService)
  • 注意不要引入循环依赖(你不应该让UserService也依赖于ProductService)
  • 通过将依赖关系连接到接口而不是具体类来限制紧耦合(这里是自动装配UserService而不是UserServiceImpl,这很好)

2)这类类型是否有名称(注入UserService和ProductService)?

是的,如前所述,您可以将此类称为Mediator,因为Mediator Pattern似乎描述了这一点。

您可以同时拥有低级服务和高级服务,将低级服务(ProductService,UserService)注入高级服务(例如,PurchaseOrderService或PurchaseOrderMediator)。或者,对于此特定情况,您可能会将产品服务视为依赖于UserService的单个高级服务。此时,更多的是在业务逻辑和应用程序的上下文中哪个构造更多cohesive

答案 1 :(得分:1)

对我来说,将服务注入另一个服务是没有问题的。正如您所说,这就是服务和SOA的关键所在。

服务可以互相帮助,以便为您提供最终结果。此外,正如JB Nizet所说,如果没有循环依赖,没问题。

答案 2 :(得分:0)

您所描述的内容称为Mediator Pattern

什么是SOA?

答案 3 :(得分:0)

使用像您提到的弹簧将一个服务注入另一个服务将耦合,这两个服务仅在所使用的界面范围内。

如果您需要更多解耦,请考虑使用消息在两个服务之间传递。

可以像使用模式的值对象/ xml一样强类型化消息 或像HashMap一样弱类型

虽然弱类型消息可以增加解耦,但这意味着您和您的客户端将放弃编译时检查,并且在运行时调试问题将非常麻烦

答案 4 :(得分:0)

您所描述的是面向对象的集成,很可能不是SOA集成。你可能得到(并且应该避免)循环依赖的事实证明了这一点。

如果您的服务知道其他服务Java级接口,那么引入紧密耦合也是一个很大的风险。 例如,用户服务的返回类型是什么?它是另一个属于用户服务的接口吗?你是否在产品服务代码中传递了它?