Spring静态自引用类模式用例

时间:2018-01-04 10:30:04

标签: java spring static self-reference

我最近偶然发现了类似下面的代码。

@Component    
public class Instance {

    private static Instance instance;
    private final Template template;

    public Instance(Template template) {
        this.template = template;
        Instance.instance = this;
    }

    static void someMethod() {
        instance.template.doSomething();
    }
}

根据我的理解,这样做是为了你可以在静态方法中使用模板,但是你可以再次将Instance类注入你需要的地方并完全避免使用静态方法。

@Component    
public class Instance {

    private final Template template;

    public Instance(Template template) {
        this.template = template;
    }

    void someMethod() {
        template.doSomething();
    }
}

我很好奇这种模式的用例是什么,如果有任何替代方案,谢谢!

1 个答案:

答案 0 :(得分:3)

[edit] 刚刚意识到静态字段是private,因此我无法将其暴露给外部的非Spring世界,正如我在下面解释的那样。

在这种情况下,我认为没有任何理由这样做。 Instance bean凭借Spring'singleton'范围是单例。所以引入这个静态私有字段没有任何意义,因此你所建议的显然是正确的方法。

[编辑前]

我想这样做是为了将Instance Spring bean暴露给与Spring无关的其他代码,即一些非Spring代码可以调用Instance.someMethod()

但在我看来,这仍然是一个坏主意,因为它在Spring bean中添加了非直观的责任:“我怎样才能从Spring外部访问?”。那么我们又为另一个Spring bean做了什么呢?将这个Spring-anti-pattern添加到所有Spring bean中?

如果在一个或几个地方需要这个,我建议使用@Configurable来Spring-ify一个可以根据需要注入依赖项的类。

否则,我建议应用程序将集中处理这个“Spring to non-Spring”interop并与bean无关:也许在启动时隐藏ApplicationContext并在内部检索bean以表示与Spring无关的API。