gpt4 book ai didi

Java Spring 设计 : all in one component?

转载 作者:行者123 更新时间:2023-11-29 07:25:48 24 4
gpt4 key购买 nike

有时 Spring 组件可能看起来像这样:

@Service
public final class SomeService {
@Autowired
private SomeService2 someService2;
@Autowired
private SomeService3 someService3;
@Autowired
private SomeService4 someService4;
// … and many other services
@Autowired
private SomeDao someDao;
@Autowired
private SomeDao2 someDao2;
@Autowired
private SomeDao3 someDao3;
// … and many other DAOs

}

换句话说,Spring 组件有很多在其他 Spring 组件中重复的服务和 DAO。恕我直言,它有以下缺点:

  • 用于 Autowiring 大多数相同组件的不必要(样板)代码
  • 有时候组件间循环引用会导致Spring上下文加载错误

如何使用结合所有服务或所有 DAO 的一体式组件。它将只包含指向 Spring 组件的链接,内部没有任何业务逻辑:

@Service
public final class AllServices {
@Autowired
private SomeService2 someService2;
@Autowired
private SomeService3 someService3;
@Autowired
private SomeService4 someService4;
// … and many other services

// get methods to get some service
public someService getSomeService(){};

并将其注入(inject)到其他组件中:

@Service
public final class SomeService {
@Autowired
private AllServices serv;
@Autowired
private AllDaos daos;
@Autowired
private Environment env;

// inside some code

serv.getSomeService().processData();

恕我直言,如果没有循环引用问题,它看起来会更简洁……

这种方法的优点和缺点是什么?

最佳答案

第二种方法可能看起来很吸引人,首先想到的是一个众所周知的外观模式,所以我完全可以理解这一点。

但是,我认为第一种模式实际上会更好,原因如下:

  1. 你说“全能”服务可以解决循环依赖

    好吧,循环依赖通常指向错误/糟糕的设计,并且本身就是代码味道,因此将它隐藏在外观后面不会改善系统,解决循环依赖会。此外,如果从由“AllServices”调用的实际服务中,您想要调用其他服务(再次,糟糕的设计被保留),那么代码可能会再次通过 AllServices,因此循环依赖仍然存在。

  2. 使用第二种设计假设这个“AllServices”类将被系统的所有组件使用,但在这种情况下它变成了“一个中心点”并且在这个类中重构可以转向疯狂 - 所有组件/它们的测试都可能受到影响

  3. 此服务的初始化本身可能会变得一团糟,因为您可能不想维护具有 20-30 个输入参数的构造函数,您将求助于字段注入(inject)(如示例中所示),它是它本身很糟糕,因为如果你想以某种方式初始化它,可能是通过测试,或者你想知道什么应该被模拟,什么不应该被模拟,以什么顺序等等。

关于Java Spring 设计 : all in one component?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53245990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com