2

フレームワークなし(スプリング/ガイダンスなし)で依存性注入を行っていますが、プレーンなJava(必要です)のみです。私の質問はロガーについてで、ロガーはどうですか? 私は通常それをインスタンス化します

private static logger = Logger.getLogger(myclass); 

ただし、これは依存性注入ではありません。ロガーを各 ctor に渡す必要がありますか? これは奇妙に見えるでしょう...では、ロガーと依存性注入についてはどうすればよいでしょうか?

PS私は、このようにセッターではなくctorを使用したDIを好みます。クラスが必要とするものを正確に知っています。

ありがとう

4

4 に答える 4

7

1 つの解決策は、 slf4jなどのファサード フレームワークを使用することです。次にLogger.getLogger(...)、実際にログ ライブラリを取得して使用します。ロギング ライブラリの変更は、構成の簡単な問題です。

Simple Logging Facade for Java または (SLF4J) は、さまざまなロギング フレームワーク (java.util.logging、log4j、logback など) の単純なファサードまたは抽象化として機能し、エンド ユーザーがデプロイ時に目的のロギング フレームワークをプラグインできるようにします。

したがって、DI を使用する場合と非常に似ていますが、おそらくこの場合の方が適切です。

于 2013-01-04T12:13:24.713 に答える
4

ロガーは、DI フレームワークを持っていてもほとんどの人が DI を使用しない例の 1 つです。

単体テストなど、DI を介してそれらを使用することを妨げるものは何もありません。

class MyClass {
    final Logger logger;

    public MyClass() {
        this(Logger.getLogger(getClass().getName());
    }

    public MyClass(Logger logger) {
        this.logger = logger;
    }
}

ところで: 私はフレームワークなしで DI を使用しており、ログに記録できるコンポーネントの数を最小限に抑えようとしています。たとえば、エラーと警告を受け取ることができるリスナー インターフェイスがあります。ロギングを行う人には、独自のロガーを取得させます。

于 2013-01-04T12:13:22.370 に答える
2

極端な良いアイデアはばかげてしまいます...すべてを注入しようとしないでください.多くの場合、クラスがそれ自体を制御でき、また制御すべきものがいくつかあります.ロガーはその1つです. ところで:初期化後にロガーを変更したくない場合を除き、に追加することをお勧めしますfinalprivate staticこれは良い習慣です。

于 2013-01-04T12:21:48.067 に答える
1

静的プロパティに注入しても意味がありません。最初に、クラスごと (静的) のロガーを使用するか、インスタンスごとのロガーを使用するかを決定する必要があります。When Static References to Log objects can be used を参照するか、この質問を参照してください。これらの投稿には、ロガーを構成する方法もいくつか示されています。

于 2013-01-04T12:54:29.840 に答える