繁体   English   中英

在Spring中使用Java单例模式(对单例的静态访问)

[英]Using Java singleton pattern (static access to the singleton) with Spring

考虑以下代码:

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需要使用构造弹簧豆时,我该怎么做? 我不想在每个需要它的类中注入A,但希望这些类能够静态访问单例实例(即A.getInstance() )。

从静态上下文访问Spring bean是有问题的,因为bean的初始化与它们的构造无关,并且Spring可以通过将它们包装在代理中来检测注入的bean。 简单地绕过this引用通常会导致意外的行为。 最好依靠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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM