【问题标题】:What is the right way to use an injected bean in a static method?在静态方法中使用注入 bean 的正确方法是什么?
【发布时间】:2013-11-06 07:11:50
【问题描述】:

这个问题可能看起来有点奇怪。假设我有一个要在具有一些静态方法的实用程序类中使用的服务。 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; } }

虽然服务是静态的,但我不得不将静态放在它的定义后面。这对我来说有点违反直觉。这是错的吗?还是更好的方法? 谢谢

【问题讨论】:

    标签: java spring dependency-injection static-methods


    【解决方案1】:

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

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

    @Component
    public class JustAClass{
      private static Service service;
    
      @Autowired
      private Service tmpService;
    
      @PostConstruct
      public void init() {
        service = tmpService;
      }
    
    }
    

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

    【讨论】:

    • 这很好,对我有用!
    • 这是定期做的事情吗?还是在这些情况下通常使用不同的方法?
    【解决方案2】:

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

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

    【讨论】:

      最近更新 更多