0

私はついにTomcatのWeldを見てみることにしました。アプリをデプロイすると、ログに次のように表示されます。

「Tomcat7が検出されました。CDIインジェクションはサーブレットとフィルタで利用可能になります」

たとえば、フィルタ/サーブレットの外部でBeanManagerを使用してBeanのインスタンスを作成するにはどうすればよいですか?

私は豆を持っています:

@javax.inject.Named(value="CarService")
@javax.enterprise.context.RequestScoped
public class CarService implements Serializable{
.
.
.

そして、指定されたリクエストコンテキストに対してBeanManagerを使用してそのインスタンスを作成したいと思います。

Context ctx = new InitialContext();
BeanManager manager = (BeanManager) ctx.lookup("java:comp/env/BeanManager");
// NOW WHAT?

これがサーブレット/フィルタで実行できる場合は、他の場所でも実行できると確信していますが、Weldコードを調べて、最初に質問せずに自分で理解したくありません。

どうもありがとうございます。

4

2 に答える 2

2

私はすでにこのSeamコードを使用していて、必要なものをすべて提供してくれました。

public static <T> T getContextualInstance(final BeanManager manager, final Class<T> type) {
        T result = null;
        Bean<T> bean = (Bean<T>) manager.resolve(manager.getBeans(type));
        if (bean != null) {
            CreationalContext<T> context = manager.createCreationalContext(bean);
            if (context != null) {
                result = (T) manager.getReference(bean, type, context);
            }
        }
        return result;
    }
于 2011-08-21T18:26:53.187 に答える
2

を使用するBeanManagerことはめったに行うべきではありません。@Inject重要なのは、依存性が必要な場所(依存性注入)で使用することです。マネージャの使用は「サービスロケータ」パターンです。

本当に必要な場合は、を使用manager.getBeans(yourDesiredClass)して、セットから1つを選択し、を呼び出しますmanager.getReference(bean, theClass, ctx)ctxによって取得されますmanager.createCreationalContext(bean)

于 2011-08-21T16:13:18.057 に答える