3

Guice 3.x を使用してインスタンスを魔法のように注入したいと考えていjava.util.logging.Loggerます。

これは私が仕事をしようとしているコードのスニペットです:

@Singleton
public class Main
{
    @Inject
    private static final Logger logger;

...
}

これはうまくいかないようです。

Exception in thread "main" java.lang.NullPointerException宣言で使用するスコープに関係なく取得します。

super.requestStaticInjection(Main.class);メソッドのmymoduleに行を追加したところ、configure()機能し始めましたが、finalキーワードを削除してstatic Logger logger.

final可能であれば、ロガーを保持したいと思います。

これを行うための適切な慣用的な Guice の方法は何ですか?

4

2 に答える 2

3

たとえば、guice で静的プロパティに注入できます。

class Dummy {
   @Inject static Foo;
}

requestStaticInjection(Dummy.class);

インジェクターconfigureModuleで。

于 2011-05-05T19:30:27.850 に答える
0

Guice最終的なフィールドインジェクションを許可しますが、お勧めしません

バインディングの値がフィールドに設定されます。挿入された値が他のスレッドに表示されない可能性があるため、finalフィールドを挿入することはお勧めしません。

source 、 set()のすべての警告にも注意してください。

これは、最終フィールドを持つことはできますが、静的な最終フィールドを注入することはできないことを意味します。

基になるフィールドがfinalの場合、このフィールドに対してsetAccessible(true)が成功し、このフィールドが非静的でない限り、メソッドはIllegalAccessExceptionをスローします。

一方、JSR 330では、最終フィールドの挿入は許可されていません。

于 2013-02-19T11:32:15.547 に答える