在服务层中制作静态方法有什么坏处 -- Spring 3

2022-09-03 12:26:09

我知道这不是一个最好的设计,而只是一个春天新手的想法。

现在我们可以轻松地在Spring框架中方便地将任何服务方法彼此联系起来。但是,创建服务类的静态工厂方法并在所有位置调用它的缺点是什么?autowire

这是很常见的,就像这样:

@Autowired
CustomerService customerService;

....
AccountDetail ad = customerService.getAccountDetail(accountId, type);

但这也应该有效:

AccountDetail ad = CustomerService.getAccountDetail(accountId, type); //if we make getAccountDetail(String, String) static

那么为什么会有像autowire这样的设计呢?它看起来很花哨,真的很酷,但这背后的工作仍然是在另一个服务对象上创建一个服务bean实例。

说真的,虽然春天遍布市场,但许多帖子和文章都在谈论优点和装修。但它是否保证了更好的性能(例如使用autowire而不是静态)?


答案 1

原因有很多:

  • 在测试过程中,你不能轻易地用模拟替换(除了PowerMock这样的工具)CustomerService

  • static方法不参与标准的、基于代理的 AOP(无事务、安全性、自定义方面)

  • 您不能再使用花哨的注入技术,例如将HTTP请求(请求范围)注入到单例范围服务中(无论如何设计不佳,但是...)

但要完整,还有一些优点:

  • static方法实际上更接近您的意图,春豆很少有状态,因此它们实际上并不需要实例即可工作

  • static调用可能更快(这在99%的程序中无关紧要)


答案 2

如果您需要拥有多个具有不同配置的客户服务组件,该怎么办?你不能用一个静态方法做到这一点。

另外,如果客户服务上有任何配置,您如何注入它?拥有一个连接到依赖对象的Bean可以集中您的配置,并使您不必搜索代码。


推荐