いくつかの調査の結果、Atmosphereはこの種の機能に(現在壊れている)フックを提供していることがわかりました。つまり、「外部」のインスタンス化にもかかわらず、通常のアノテーションを使用してAtmosphereで機能させることが可能です。
コードがデプロイされる場所がわかっている場合は、同じパッケージに同じ名前のクラスを配置し、適切なインジェクターを提供することで、AtmosphereのデフォルトのnoopInjectorProviderクラスを上書きできます。
この回答の最後にJBossAS7のコードと、自分でテストしていないGoogleGuiceとSpringで動作するはずのコードへのリンクを追加しています。
コードを複数のプラットフォームで動作させる必要がある場合は、実行しているものを検出して適切なインジェクターを返す方法を理解する必要があります。私は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インジェクター、未テスト:https ://github.com/Atmosphere/atmosphere/blob/atmosphere-1.0.x/extras/guice/src/main/java/org/atmosphere/guice/GuiceInjector.java
スプリングインジェクター、未テスト:https ://github.com/Atmosphere/atmosphere/blob/atmosphere-1.0.x/extras/spring/src/main/java/org/atmosphere/spring/SpringInjector.java