背景問題
テキストメッセージを送信するために、マルチチャンネルのユーザーの使用が、一つだけの入り口、そして後に放棄または拡張チャネルを、その実装に継承を使用することができます。
まず、親クラスのいくつかは、特に以下のインタフェースの送信者、送信テキストメッセージやその他の基本的なパブリックメソッドを定義しています。
パブリック インターフェースセンダ{ ボイド送信(); }
次のようにサブクラスとして各チャネルは、送信インタフェース、基本的なメソッドを継承します。
@Service
publicクラスBaseSender1は、送信者を実装{ @Override ます。public void センド(){ システム。out.printlnを("BaseSender1.send()" ); } }
@Service
publicクラスBaseSender2は、送信者を実装{ @Override ます。public void センド(){ システム。out.printlnを("BaseSender2.send()" ); } }
@Service
publicクラスBaseSender3は、送信者を実装{ @Override ます。public void センド(){ システム。out.printlnを("BaseSender3.send()" ); } }
テキストメッセージを送信するとき、あなたはテキストメッセージを送信するように選択することから、チャネルのセットを取得する必要があり、ここではApplicationContextAwareは、具体的な実現を見て、使用しています:
@Component @ SLF4J パブリック クラス SenderUtilは実装ApplicationContextAware { プライベートコレクション<送信者> 送信者を。 @Override 公共 ボイド setApplicationContext(ApplicationContextのApplicationContextの)はスローBeansException { log.info( "ApplicationContextの:{}" 、ApplicationContextのを)。 送信者 = applicationContext.getBeansOfType(送信者クラス).values(); senders.forEach(送信者::送ります)。 } パブリックコレクション<送信側> getSenders(){ 戻り送信者と、 } }
SenderUtil継承ApplicationContextAwareインターフェース、setApplicationContext方法、setApplicationContext方法は、我々は、Senderタイプビーンへのアクセス、およびマップにインスタンス化、取得したマップ値最後トラバーサル送信者サブクラスが設定ApplicationContextのコンテキストを取得します。
実装プロセス
クラスのインターフェイスは自動的にApplicationContextの注射、起動時にsetApplicationContextメソッドを呼び出し、ApplicationContextAwareのSpringコンテナを実装しました。ApplicationContextAwareクラスは、インターフェイスを使用することができる、容器内に登録する必要が実装@Componentのプロファイルまたは構成に注釈を。ApplicationContextAwareはコンテキストを取得使用する場合は、コードとコードは、現在実行中の春は、同じコンテキストにある、ApplicationContextののGETが空であることを確認する必要があります。
PS:なぜ使用しないClassPathXmlApplicationContextをそのコンテキストを取得するには、設定ファイルをロードし、これは可能ですが、ApplicationContextのはその1を生成しませSpringコンテナを取得するには、この時点で、冗長性を持つことになりますので、このアプローチを使用しないでください。