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如何更改某些内容。感谢您的清理。这正是我所希望的解释!