在服务层中制作STATIC方法有什么危害 - Spring 3

Dre*_*mer 11 java spring spring-mvc

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

现在我们可以autowire在Spring框架中方便地将任何服务方法相互配合.但是创建服务类的静态工厂方法并在任何地方调用它有什么缺点?

它很常见:

@Autowired
CustomerService customerService;

....
AccountDetail ad = customerService.getAccountDetail(accountId, type);
Run Code Online (Sandbox Code Playgroud)

但这也应该有效:

AccountDetail ad = CustomerService.getAccountDetail(accountId, type); //if we make getAccountDetail(String, String) static
Run Code Online (Sandbox Code Playgroud)

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

说实话,春天到处都是市场,所以很多帖子和文章都在谈论专业和装修.但它是否保证了更好的性能(比如使用autowire而不是静态)?

Tom*_*icz 17

原因很多:

  • CustomerService在测试期间你不能轻易用模拟替换(除了PowerMock之类的工具)

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

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

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

  • static 方法实际上更接近你的意图,Spring bean很少有状态,因此它们实际上不需要实例来工作

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


Ala*_*ger 5

如果您需要多个具有不同配置的 CustomerService 组件怎么办?您无法使用单个静态方法来做到这一点。

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