Java Spring静态自引用类模式用例

Java Spring静态自引用类模式用例,java,spring,static,self-reference,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; }

我最近偶然发现了下面这样的代码

@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();
    }
}
据我所知,这样做是为了让您可以在静态方法中使用模板,但同样,您可以将实例类注入到需要它的地方,并完全避免使用静态方法

@Component    
public class Instance {

    private final Template template;

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

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

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

[edit]刚刚意识到静态字段是私有的,因此不能暴露给外部的非Spring世界,正如我在下面解释的那样

那样的话,我看不出有任何理由这样做。
实例
bean由于Spring的“singleton”作用域是单例的。因此,引入这个静态私有字段没有任何意义,因此您所建议的显然是正确的方法


[编辑前]

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

但在我看来,这仍然是一个坏主意,因为它在Springbean中增加了非直觉的责任:“如何从Spring外部访问我?”。那么,我们要为另一个春豆做些什么呢?将此Spring anti模式添加到所有Spring Bean

如果在一个或几个地方需要这样做,我建议使用Spring创建一个类,您可以根据需要注入依赖项


否则,我建议应用程序集中处理这个“Spring到非Spring”的互操作,与bean无关:可能在启动时隐藏bean并在内部检索Spring不可知API。

实例
私有不会阻止您调用
实例.someMethod()
,因此,我看不出编辑的原因。前面的答案仍然正确。@Tom谢谢你。我主要是想从其他一些非Spring代码中访问Instance.someMethod(),这仍然是可能的(每个类都可以调用
Instance.someMethod()
,只要它放在同一个包中),我也同意这肯定是代码实现成这样的主要原因。我想我在这里遗漏了一些东西,因为代码看起来像是要将
someMethod
公开给非Spring类或静态对象,并以这种方式使用,您的答案正确地解释了这一点。我仍然不知道
实例上的
private
modify如何更改某些内容。感谢您的清理。这正是我所希望的解释!