gpt4 book ai didi

java - 无法让@Singleton 做任何事情

转载 作者:行者123 更新时间:2023-12-01 14:15:25 25 4
gpt4 key购买 nike

在 JBoss AS7 上运行,我有这个:

import javax.inject.Singleton;

@Singleton
public class Connections {
private final List<AtmosphereResource> connections = new ArrayList<AtmosphereResource>();

public void add(AtmosphereResource event) {
connections.add(event);
}
}

还有这个:

import javax.inject.Inject;

public class PubSubAtmosphereHandler extends AbstractReflectorAtmosphereHandler {
@Inject
private Connections connections;

@Override
public void onRequest(AtmosphereResource event) throws IOException {
[...]
connections.add(event); // <---
}

指定行上的 NPE。在阅读了无数的页面和示例之后,这是重复了数十次的方法之一,但仍然行不通。我有一个空的 beans.xml,放在我的 WEB-INF 中。我在这里错过了什么?

最佳答案

经过一些研究,事实证明 Atmosphere 为这种功能提供了(目前已损坏的)钩子(Hook)。这意味着它可以简单地使用您的普通注释并让它与 Atmosphere 一起工作,尽管有“外部”实例化。

如果您知道您的代码将部署在哪里,您可以简单地覆盖 Atmosphere 中的默认 noop InjectorProvider 类,方法是在同一包中创建一个具有相同名称的类,并让它提供适当的注入(inject)器。

我在这个答案的末尾添加了 JBoss AS7 的代码,以及应该在 Google Guice 和 Spring 上工作的代码链接,我自己没有测试过。

如果您需要您的代码在多个平台上工作,您可能需要弄清楚如何检测您正在运行的平台,然后返回适当的 Injector。由于我对 Guice 和 Spring 不是很熟悉,所以我会把这个练习留给读者。

JBoss AS7 的脏“初稿”代码(请记住,这必须进入声明的包以覆盖默认的 noop 提供程序):

package org.atmosphere.di;

import java.util.NoSuchElementException;
import java.util.ServiceLoader;

import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class InjectorProvider {

private InjectorProvider() {}

public static Injector getInjector() {
return LazyProvider.INJECTOR;
}

private static final class LazyProvider {
private static final Injector INJECTOR;

static {
Injector injector = new Injector() {
@Override public void inject(final Object o) {
try {
final BeanManager bm = (BeanManager) new InitialContext().lookup("java:comp/BeanManager");
final CreationalContext cc = bm.createCreationalContext(null);
final InjectionTarget it = bm.createInjectionTarget(bm.createAnnotatedType(o.getClass()));
it.inject(o, cc);
cc.release();
} catch (final NamingException e) {
e.printStackTrace();
}
}
};
try {
injector = ServiceLoader.load(Injector.class).iterator().next();
} catch (final NoSuchElementException e) {}
INJECTOR = injector;
}
}
}

请注意,包装代码取自 Atmosphere 代码库,并且是在 Java 中执行单例的一种非常糟糕的方法。您可能不想在生产中“按原样”使用它。

Guice 注入(inject)器,未经测试:https://github.com/Atmosphere/atmosphere/blob/atmosphere-1.0.x/extras/guice/src/main/java/org/atmosphere/guice/GuiceInjector.java

Spring 注入(inject)器,未经测试:https://github.com/Atmosphere/atmosphere/blob/atmosphere-1.0.x/extras/spring/src/main/java/org/atmosphere/spring/SpringInjector.java

关于java - 无法让@Singleton 做任何事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13827293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com