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

Java 在静态方法中使用注入bean的正确方法是什么?,java,spring,dependency-injection,static-methods,Java,Spring,Dependency Injection,Static Methods,这个问题似乎有点奇怪。假设我有一个服务,我想在一个有一些静态方法的实用程序类中使用它。该服务是一个Springbean,因此我自然会使用setter和(@Autowired)将其注入到我的实用程序类中。 正如Spring文档中提到的,所有bean在bean上下文中都是静态的。所以,当您想要在类中注入bean时,您不必使用“静态”修饰符。见下文: public class JustAClass{ private Service service; public void aMethod(

这个问题似乎有点奇怪。假设我有一个服务,我想在一个有一些静态方法的实用程序类中使用它。该服务是一个Springbean,因此我自然会使用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;
  }

}
现在回到我首先提到的(在静态方法中使用服务):

虽然服务是静态的,但我不得不将静态置于其定义之后。这对我来说有点违反直觉。这是错的吗?或者这是更好的方式?
谢谢你别无选择。如果您想初始化一个类的
静态
字段,您必须让Spring创建该类的实例并注入值


一点建议。在这种情况下,您没有任何理由使用
静态方法。如果您想要一个单例实用程序,只需使bean具有
singleton
作用域。

您不能自动连接静态字段

但你可以做一些变通:

@Component
public class JustAClass{
  private static Service service;

  @Autowired
  private Service tmpService;

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

}

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

这很好,适合我!这是不是应该定期做的事情?或者,在这些情况下,是否通常使用不同的方法?
@Component
public class JustAClass{
  private static Service service;

  @Autowired
  private Service tmpService;

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

}