2013-10-27 69 views
8

这个问题看起来有点奇怪。假设我有一个服务,我想在具有一些静态方法的Utility类中使用。该服务是一个Spring bean,很自然我会使用setter和(@Autowired)将它注入我的实用类。如在Spring的文档中提到的,所有bean在bean上下文中都是静态的。所以当你想在一个类中注入一个bean时,你不必使用“static”修饰符。请看下图:在静态方法中使用注入bean的正确方法是什么?

 

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; 
    } 

} 
 

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

回答

12

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

但是你可以做一个小的解决方法:

@Component 
public class JustAClass{ 
    private static Service service; 

    @Autowired 
    private Service tmpService; 

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

} 

注意,你必须声明这个类的“分量”注入tmpService

+0

这是很好的,对我的作品! – Kaunteya

+0

这是否会定期完成?或者在这些情况下通常采用不同的方法? –

3

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

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

相关问题