我最近偶然发现了类似下面的代码。
@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();
}
}
我很好奇这种模式的用例是什么,如果有任何替代方案,谢谢!
答案 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。