2

@Inject を使用して、外部フレームワークによって管理されているインスタンスを CDI アプリケーションに公開したいと考えています。これらのインスタンスは、ライフサイクルがさまざまなキャッシング戦略に基づいているため、この別のフレームワークを提供する必要があります。

例: 同じスレッド スコープ内で同じインスタンスが表示され、多くのリクエスト スコープにわたって存在する可能性があり、セッション スコープは適用されません。これらの種類のインスタンスを対象とする新しいスコープを定義する必要があるようですか?

これを行う最善の方法は何ですか?エクステンション、プロデューサーメソッドで可能ですか?

以下を使用してプロデューサーメソッドで動作するようになりました。

@Inject
@CustomInject
FwObject obj;

@Produces
@CustomInject
FwObject createConfig(InjectionPoint p) {
  return (FwObject) ctx.get((Class<?>) p.getType());
}

しかし、これにより、共通のフレームワーク インターフェイスがないため、生成された型について明示することができなくなりました。

どんな助けでも感謝します。

4

2 に答える 2

1

おそらくプロデューサー メソッドを使用する場合は、すべて必要なものに依存しますが、おそらく拡張機能を使用するのが最善の方法です。新しいスコープを使用する必要がある場合 (JSF を使用している場合は Conversation スコープが機能する場合があります)、拡張機能を作成する必要があります。

于 2012-11-03T05:13:01.070 に答える
0

カスタムスコープを作成することで解決したと思います。次の記事は本当に役に立ちました。

これは、私がそれをどのように解決したかの非常に簡単な説明です。

カスタム スコープ アノテーションを作成します。

import javax.enterprise.context.NormalScope;
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@NormalScope
public @interface CustomScope {
}

カスタム コンテキストを作成します。

import javax.enterprise.context.spi.Context;
public class CustomContext implements Context {
  private MyFw myFw = .... ;

  @Override
  public Class<? extends Annotation> getScope() {
    return CustomScope.class;
  }
  @Override
  public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) {
    Bean bean = (Bean) contextual;
    return (T) myFw.get(bean.getBeanClass());
  }
  @Override
  public <T> T get(Contextual<T> contextual) {
    Bean bean = (Bean) contextual;
    return (T) myFw.get(bean.getBeanClass());
  }
  @Override
  public boolean isActive() {
    return true;
  }
}

拡張機能を作成し、コンテキストを登録します。

import javax.enterprise.inject.spi.Extension;
public class CustomContextExtension implements Extension {
  public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) {
    event.addContext(new CustomContext());
  }
}

拡張子を登録します。

CustomContextExtension を META-INF/javax.enterprise.inject.spi.Extension に追加します

フレームワーク オブジェクトに CustomScope を追加します。

@CustomScope
public class FwObject { ... }

必要に応じて @Inject を使用して FwObject を注入します。

public class MyService {
  @Inject
  FwObject obj;
}
于 2012-11-03T14:08:09.383 に答える