java - 在 spring 中使用 Java singleton Pattern ( static 访问单实例)

  显示原文与译文双语对照的内容

考虑以下代码:


public class A {
 private static final A INSTANCE = new A();
 public static A getInstance() {
 return INSTANCE;
 }
 private A() {}
 public void doSomething() {}
}

//elsewhere in code
A.getInstance().doSomething();

当A 需要构建 spring 时,我该怎么做? 我不想在需要它的每个类中注入一个,但希望这些类能够访问静态( IE,A.getInstance() ) 实例。

时间:

在一个环境中访问一个 spring bean有问题,因为bean的初始化没有绑定到它们的构造,而 spring 可以通过将它们封装到代理中,从而导致unexpected的行为常常会导致意外的行为。 最好依赖于 spring 机制的注入。

如果你真的没有使用( 可能是因为你需要从遗留代码访问),那么使用类似这样的东西:


@Service
public class A implements ApplicationContextAware {

 private static final AtomicReference<A> singleton;
 private static final CountDownLatch latch = new CountDownLatch(1);

 @Resource
 private MyInjectedBean myBean;//inject stuff...

 public static A getInstance() {
 try {
 if (latch.await(1, TimeUnit.MINUTES)) {
 return singleton.get();
 }
 } catch (InterruptedException e) {
 Thread.currentThread().interrupt();
 }
 throw new IllegalStateException("Application Context not initialized");
 }

 @Override
 public void setApplicationContext(ApplicationContext context) {
 singleton.set(context.getBean(A.class));
 latch.countDown();
 }
}

...