在静态方法中使用注入bean的正确方法是什么?

时间:2013-10-27 14:24:36

标签: java spring dependency-injection static-methods

这个问题看起来有点奇怪。假设我有一个服务,我想在具有一些静态方法的Utility类中使用。该服务是一个Spring bean,所以我自然会使用一个setter和(@Autowired)将它注入我的实用程序类。 正如Spring的文档中提到的,所有bean在bean上下文中都是静态的。因此,当你想在课堂上注入一个bean时,你不必使用" static"修改。见下文:


public class JustAClass{
  private Service service;

  public void aMethod(){
     service.doSomething(....);
  }

  @Autowired
  public void setService(Service service){
     this.service = service;
  }

}

现在回到我先提到的内容(在静态方法中使用Service):


public class JustAClass{
  private static Service service;

  public static void aMethod(){
     service.doSomething(....);
  }

  @Autowired
  public void setService(Service service){
     this.service = service;
  }

}

虽然Service是静态的,但我被迫将静态置于其定义之后。这对我来说有点违反直觉。这是错的吗?还是更好的方式? 感谢

2 个答案:

答案 0 :(得分:14)

您无法自动装配静态字段。

但是你可以做一些解决方法:

@Component
public class JustAClass{
  private static Service service;

  @Autowired
  private Service tmpService;

  @PostConstruct
  public void init() {
    service = tmpService;
  }

}

注意,您必须将此类声明为“Component”以注入tmpService

答案 1 :(得分:3)

你别无选择。如果要初始化类的static字段,则必须让Spring创建该类的实例并注入该值。

一点建议。在这种情况下,您没有任何理由使用static方法。如果你想要一个单例实用程序,只需让你的bean有singleton范围。