我知道这不是最好的设计,只是来自Spring新手的想法。
现在我们可以在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实例。
严重的是,虽然Spring遍布整个市场,但很多帖子和文章都在讨论专业人士和专业人士。整修。但它是否能保证更好的性能(比如使用autowire而不是静态)?
答案 0 :(得分:16)
有很多原因:
在测试过程中,你无法轻易用模拟替换CustomerService
(除了PowerMock之类的工具)
static
方法不参与基于代理的标准AOP(无交易,安全性,自定义方面)
您不能再使用花式注入技术,例如将HTTP请求(请求作用域)注入单一作用域服务(无论如何设计不佳,但......)
但要完成,还有一些优点:
static
方法实际上更接近你的意图,Spring bean很少有状态,因此它们实际上不需要实例来运作
static
来电可能会更快(这与99%的节目无关)
答案 1 :(得分:4)
如果您需要具有不同配置的多个CustomerService组件,该怎么办?你不能用一个静态方法做到这一点。
另外,如果在CustomerService上有任何配置,你如何注入它?将连接到依赖对象的bean集中在一起,可以使您无需查看代码。