2011-11-02 7 views
1

に基づいて、クラスの異なるインスタンスを注入するスプリングを使用した:私はこれらの線に沿ったクラス構造を有するインスタンス階層

public class Worker { 
    private Parser parser; 
    private Validator validator; 
    private Feeder feeder; 

    //... 
} 

ParserValidatorFeederは、すべての異なる実装するクラスとのインタフェースです。これらのフィールドは、ワーカーのインスタンス化のコンテキスト内でインスタンス化され、ワー​​カー間で共有されません。

私がしたいことは、各ワーカーに対してorg.slf4j.Loggerの単一のインスタンスを作成し、必要に応じてパーサー、バリデーター、フィーダーによって使用されることです。基本的には、インスタンス生成時に、我々はそうのように、すべてのログは、その名前を使用していその後、労働者に名前を付け、そしてたい:

public class XmlParser implements Parser { 
    @Autowired 
    private Logger logger; 

    //... 
} 

org.slf4j.LoggerFactory.getLogger(workerName) 

理想的には、私はこれらの線に沿って解決策を希望します

そして、同じWorkerに属するすべてのオブジェクトでLoggerの同じインスタンスを使用するようにSpring Frameworkのautowiring機能を設定します。異なる労働者は明らかに異なるロガーインスタンスを取得する必要があります。すべての3つのインターフェイスを強制的に、ValidatorFeedersetLogger()タイプのメソッドを指定するには、少なくとも控えめに言ってもエレガントではないようです。

巧妙な依存性注入ソリューションを使用してこのタスクを達成するにはどうすればよいですか?

+0

また、['LoggerFactory.getLogger(Worker.class);'](http://slf4j.org/api/org/slf4j/LoggerFactory.html) –

+0

@JohanSjöberg:ワーカーのいくつかのインスタンスそのシナリオでは同じLoggerを共有します。それが要件でない場合は、次のようなソリューションを使用できます:http://jgeeks.blogspot.com/2008/10/auto-injection-of-logger-into-spring.html –

答えて

0

私はあまり春の魔法なしでこれを実現する最も簡単な方法は、あなたが通常行うのと同じよう単に労働者にロガーを作成することだと思う。そして、

final static Logger logger = LoggerFactory.getLogger("workerName"); 

とあなたの労働者がこのロガーを設定しています異なるコンポーネント。あなたのコンポーネントがSpringによってインジェクションされている場合は、ワーカーにInitializingBeanを実装させ、ロガーをafterPropertiesSet()に設定してください。

これをより動的に実行したい場合は、this exampleを参照してください。BeanPostProcessorとリフレクションを使用して正しいロガーを注入します。

0

作業者の値をMDCに設定してみてください。異なるマーカーによって生成されたログを区別することが目的ならば、MDCの設定で十分です。異なる従業員によって生成されたログを別のファイルに移動させたい場合は、 にはSiftingAppenderとMDCBasedDiscriminatorがあります。

関連する問題