インターフェイスコールバック
リスナーは基本的にコールバックメカニズムを使用して、アクションが発生する前または後に独自のコードの一部を実行します。 Java言語では、インターフェイスを使用できます。
リスナーケースを実装します
便利なため、春の環境で直接定義します。作業の冒頭(または最後に)でリスナーを定義するための仕事を例にしてください。
1.コールバックのインターフェイスを定義します
パッケージcom.yawn.demo.listener;/** * @author 2018-01-21 13:53 */public interface worklistener {void onstart(string name);}2。アクションを定義します
パッケージcom.yawn.demo.service; import com.yawn.demo.listener.worklistener;/** * @author 2018-01-21 13:39 */ @servicepublic class myservice {@Resource Private PersonService PersonService;プライベートワークリストナーリスナー。 public void setWorkListener(worklistener worklistener){this.listener = worklistener; } public void work(string name){ristener.onstart(name); personservice.work(); }}アクションワークは特定の方法です。作業()メソッドの適切な時期に、上記で定義されたインターフェイスが呼び出されます。さらに、このアクション定義クラスでは、リスナーを設定する方法を改善する必要があります。
3。テストを聞いてください
@runwith(springrunner.class)@springboottestpublic class demospringannotationapplicationtests {@resource private myservice myservice; @test public void test1(){//インターフェイス設定リスナーmyservice.setworklistener(new worklistener(){@override public void onstart(string name){system.out.println( "for" + name + "!");}}); system.out.println( "" + name + "!"のWorkを開始)); // myservice.work( "boss"); } @test public void test2(){//実装クラスを継承して、リスナーmyService.setWorkListener(new MyWorkListener()); // myservice.work( "boss"); } class myWorkListener extends worklisteneradaptor {@override public void onstart(string name){system.out.println( "for" + name + "!"の開始作業を開始); }}}上記の2つの方法を使用してテストすると、結果が得られました。
ボスのために仕事を始めましょう!一生懸命働く...
これは、アクション作業が行われる前に、テストクラスで書いたリスニングコードが実行され、クラスリスニングの目的を達成することを示しています。
注釈でリスナーを実装します
上記のコードでは、SetWorkListener(WorkListenerリスナー)メソッドを呼び出すことは、一般に、アクションリスナーとして書いたリスニングコードを設定するための設定(レジスタ)リスナーと呼ばれます。ただし、リスナーを登録するたびに、通常、クラスを作成して定義されたインターフェイスを実装するか、インターフェイスを実装するクラスを継承してから、インターフェイス定義メソッドを書き直す必要があります。したがって、スマートプログラマーはこのプロセスを簡素化したいと考えていたため、注釈を使用する方法を思いつきました。注釈を使用して、リスニングコードセグメントをメソッドに記述し、注釈を使用してこのメソッドをマークします。
実際、使用は簡単になりましたが、実装は必ずしも真実ではありません。
1。注釈を定義します
パッケージcom.yawn.demo.anno; @target(elementtype.method)@retention(retentionpolicy.runtime)public @interface worklistener {}2。分析的な注釈
パッケージcom.yawn.demo.anno; import com.yawn.demo.service.myservice; Import org.springframework.beans.beansecception; Import org.springframework.factory.Initializingbean; Import org.springframework.context.context.context; org.springframework.context.applicationcontextaware; Import org.springframework.stereotype.component; Import javax.annotation.runsource; import java.lang.annotation.annotation; import java.lang.lang.reflect.method; import java.util.util.util.util.util.linkedhishmap; @aothが2018-01-21 14:46 */ @ @componentpublic class worklistenerparserを実装するapplicationContextAware、initializingbean {@Resource private myService myService; private ApplicationContext ApplicationContext; @Override public void avidePropertiesset()スロー例外{map <string、object> listenerbeans = getexpectlistenerbeans(controller.class、retscontroller.class、service.class、component.class); for(objectリスナー:ristenerbeans.values()){for(method method:ristener.getClass()。getDeclaredMethods()){if(!method.IsannotationPresent(worklistener.class)){contion; } myService.setWorkListener(name-> {try {method.Invoke(ristener、name);} catch(exception e){e.printstacktrace();}}); }}}}} / ** *アノテーションを使用することができる豆を見つけます * @param annotationTypesクラスレベルのアノテーションタイプはスキャンします * @returnマップのスキャンマップ * /プライベートマップ<ストリング、オブジェクト> getexpectlistenerbeans(class <? linkedhashmap <>(); for(class <?extends annotation> annotationType:annotationTypes){map <string、object> annotatedbeansmap = applicationContext.getBeanswithAnnotation(annotationType); listenerbeans.putall(annotatedbeansmap); }リスナービーンズを返します。 } @Override public void setApplicationContext(applicationContext applicationContext)throws beansexception {this.applicationContext = applicationContext; }}注釈の分析中に、リスナーを設定します。
解析クラスでは、インターフェイスApplicationContextAwareが実装されています。クラスのApplicationContextへの参照を取得するために、IOCコンテナ内のBeanを取得するために使用されます。インターフェイスInitialIngizingBeanの実装が実装されており、アノテーションを解析し、リスナーを適切な時間に設定するコードを実行します。これを行わない場合は、CommandLinerunnerが実行されたときに解析されたコードと設定コードを呼び出し、ApplicationContextを自動的に注入することもできます。
3。テスト
上記のコードを実行した後、リスナーはすでにセットアップされており、テストできます。
パッケージcom.yawn.demo.controller; import com.yawn.demo.anno.worklistener; Import com.yawn.demo.service.myservice; Import org.springframework.web.bind.annotation.getMapping; Import org.springframework.web.bind.annotation.Restcontrerrer; javax.annotation.resource;/** * @author 2018-01-21 13:28 */ @restcontrollerpublic class testController {@Resource PrivateMyServiceMyService; @getMapping( "/work")public object work(){myservice.work( "boss"); 「done」を返します。 } @worklistener public void risten(string name){system.out.println( "for" + name + "!"のWorkを開始); }}監視方法を記述します。パラメーターのタイプと数値はインターフェイスと同じです。次に、カスタムアノテーションを追加します。環境が開始された後、リスナーはすでに設定されています。
次に、URLを介してmyServiceの作業()メソッドを呼び出すと、結果が表示されます。
ボスのために仕事を始めましょう!一生懸命働く...
リスニング方法が呼び出されました。次の開発では、この注釈を使用してリスナーを登録できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。