5

slf4j ロガーに CDI インジェクションを使おうと考えているので、プロデューサーを作成しました。

ApplicationScopedはシリアライズ可能なBeanにそれを注入しています:

@ApplicationScoped
public final class CurrentApplicationBean implements Serializable {
    @Inject
    private transient Logger          logger;
}

org.slf4j.Loggerは拡張されないインターフェイスであるため、一時的である必要がありますSerializableが、これは、逆シリアル化後にロガーを再注入する必要があることを意味します。

CDIはそれを処理していないと思いますが、あなたは何を知っていますか?

Loggerさらに、プロバイダはからロガー名を設定する必要があるため、常に新しいインスタンスを提供しますInjectionPoint。これは、RequestScopedクラスごとの静的ロガーではなく、Bean が独自のロガー インスタンスを持つことを意味します。

ロギングは、CDI インジェクションの適切なコンテキストではないかもしれません...あなたの考慮事項は何ですか?

4

1 に答える 1

1

ただし、これは、逆シリアル化後にロガーを再注入する必要があることを意味します。

CDI コンテナ プロキシはシリアライズ可能です。逆シリアル化されると、プロキシは適切なインジェクションを見つけてバインドします。注入ポイントを一時的なものとしてマークしません。コンテナが注入を見つけたり再結合したりするのを防ぎ、NPE が発生するためです。

これは、RequestScoped Bean が、クラスごとの静的ロガーではなく、独自のロガー インスタンスを持つことを意味します。

プロデューサーメソッドが次のような場合

@RequestScoped
@Produces   
public Logger produceLog(InjectionPoint injectionPoint) {   
    return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());   
}

LoggerFactory.getLogger() は、クラスごとに 1 つのロガーを作成しています。

ロギングは、CDI インジェクションの適切なコンテキストではない可能性があります...考慮事項は何ですか?

君の選択。

于 2013-12-20T21:58:49.177 に答える