10

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


public class JustAClass{
  private Service service;

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

  @Autowired
  public void setService(Service service){
     this.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 是静态的,但我不得不将静态放在它的定义后面。这对我来说有点违反直觉。这是错的吗?还是更好的方法?谢谢

4

2 回答 2

15

您不能自动装配静态字段。

但是您可以采取一些解决方法:

@Component
public class JustAClass{
  private static Service service;

  @Autowired
  private Service tmpService;

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

}

请注意,您必须将此类声明为“组件”才能注入 tmpService

于 2013-10-27T18:55:51.390 回答
3

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

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

于 2013-10-27T14:30:28.457 回答