인터페이스 콜백
리스너는 본질적으로 콜백 메커니즘을 사용하여 작업이 발생하기 전후에 우리 자신의 코드 중 일부를 실행합니다. Java 언어에서는 인터페이스를 사용할 수 있습니다.
청취자 케이스를 구현하십시오
편의를 위해, 스프링 환경에서 직접 정의하십시오. 작업의 시작 (또는 끝)에서 청취자를 정의하기위한 예제로 작업을 취하십시오.
1. 콜백의 인터페이스를 정의합니다
패키지 com.yawn.demo.listener;/** * @author는 2018-01-21 13:53 */public interface worklistener {void onstart (String name);}에 의해 생성되었습니다.2. 행동을 정의하십시오
package com.yawn.demo.service; import com.yawn.demo.demo.listener.worklistener;/** * @author는 2018-01-21 13:39 */ @servicepublic class myservice {@resource private personervice perservice; 개인 작업 목록 청취자; public void setworklistener (Worklistener Worklistener) {this.listener = Worklistener; } public void work (문자열 이름) {Listener.onstart (이름); 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 ( " + name +"! System.out.println ( "" + name + "!"))); // 작업 myservice.work ( "보스"); } @test public void test2 () {// 구현 클래스를 상속하여 청취자 myservice.setworkListener (new myWorkListener ())를 설정합니다. // 작업 myservice.work ( "보스"); } class myWorkListener Extends WorkListEnerAdAptor {@Override public void onstart (String name) {System.out.println ( "" + name + "!"); }}}위의 두 가지 방법을 사용하여 테스트 결과를 얻었습니다.
보스를 위해 일을 시작하십시오! 열심히 일합니다 ...
이것은 액션 작업이 일어나기 전에 테스트 클래스에 쓴 청취 코드가 수업 청취의 목적을 달성하기 위해 실행된다는 것을 보여줍니다.
주석으로 리스너를 구현합니다
위 코드에서 SetWorkListener (WorkListener Listener) 메소드를 호출하는 것을 일반적으로 설정 (register) 리스너라고하며, 이는 Action Lisper로 작성된 청취 코드를 설정하는 것입니다. 그러나 청취자를 등록 할 때마다 일반적으로 정의 된 인터페이스를 구현하거나 인터페이스를 구현하는 클래스를 상속받은 다음 인터페이스 정의 방법을 다시 작성해야합니다. 따라서 스마트 프로그래머는이 프로세스를 단순화하기를 원했기 때문에 주석을 사용하는 방법을 생각해 냈습니다. 주석을 사용하여 메소드에 청취 코드 세그먼트를 작성하고 주석을 사용 하여이 메소드를 표시하십시오.
실제로 사용은 간단 해졌지만 구현이 반드시 사실은 아닙니다.
1. 주석을 정의하십시오
package com.yawn.demo.anno; @target (eleMenttype.Method) @retention (rendentionPolicy.runtime) public @interface worklistener {}2. 분석 주석
패키지 com.yawn.demo.anno; import com.yawn.demo.demo.service.myservice; import org.springframework.beans.beansexception; import org.springframework.beans.ackory.initializingbean; import org.springframework.context.applicationcontext; org.springframework.context.applicationcontextaware; import org.springframework.stereotyp.component; import javax.annotation.resource; import java.lang.annotation.annotation; import java.lang.reflect.method; import java.util.linkedhashmap; @Author는 2018-01-21 14:46 */ @ComponentPublic Class WorkListenerParser에 의해 생성 된 @Author ApplicationContextAware, 초기화 {@Resource private myService myService; Private ApplicationContext ApplicationContext; @override public void afterProperTiesset ()는 예외를 {map <string, object> warnerBeans = getExpectListenerBeans (controller.class, restController.class.class, component.class); for (객체 청취자 : warnerBeans.values ()) {for (메소드 메소드 : warner.getClass (). getDeclaredMethods ()) {if (! method.isannotationPresent (Worklistener.class)) {계속; } myService.setworkListener (이름 -> {try {method.invoke (Lister, name);} catch (예외 e) {e.printstacktrace ();}}); }}}} / ** * 주석을 사용할 수있는 콩을 찾으십시오 * @param annotationtypes 스캔 해야하는 클래스 레벨 주석 유형을 스캔 해야하는 * @return scended * / private map <string, object> getexpectListenerBeans (class <? extends annottationTypes) {map <map <string, map <clerse, getexpectlistenerbeans) LinkedHashMap <> (); for (class <? extends annotation> annotationType : annotationTypes) {map <string, object> annotatedBeansMap = applicationContext.getBeanSwitHannotation (AnnotationType); ListenerBeans.putAll (AnnoTatedBeansMap); } 리턴 리스너 비안을 반환합니다. } @override public void setApplicationContext (ApplicationContext ApplicationContext)는 beansexception {this.applicationContext = ApplicationContext; }}주석을 분석하는 동안 청취자를 설정하십시오.
구문 분석 클래스에서는 인터페이스 ApplicationContextAware가 구현됩니다. 클래스에서 ApplicationContext에 대한 참조를 얻기 위해 IOC 컨테이너에서 Bean을 얻는 데 사용됩니다. 그리고 인터페이스 초기화 비안의 구현은 구문 분석 주석 코드를 실행하고 적절한 시간에 리스너를 설정하기 위해 구현됩니다. 이 작업을 수행하지 않으면 CommandLinerUnner가 실행될 때 구문 분석 및 설정 코드를 호출 할 수 있으며 ApplicationContext도 자동으로 주입 할 수 있습니다.
3. 테스트
위의 코드를 실행 한 후에도 리스너가 이미 설정되어 테스트 할 수 있습니다.
package com.yawn.demo.controller; import com.yawn.demo.no.worklistener; import com.yawn.demo.service.myservice; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.restcontroller; javax.annotation.resource;/** * @author는 2018-01-21 13:28 */ @restcontrollerpublic class testcontroller {@resource private myservice myservice; @GetMapping ( "/work") public Object Work () {myservice.work ( "boss"); "완료"를 반환하고; } @WorkListener public void Listen (문자열 이름) {System.out.println ( "" + name + "!"); }}모니터링 방법을 작성하고 매개 변수 유형과 숫자는 인터페이스와 동일하며 사용자 정의 주석을 추가하십시오. 환경이 시작된 후에도 청취자가 이미 설정되어 있습니다.
그런 다음 URL을 통해 myservice의 work () 메소드를 호출하면 결과를 볼 수 있습니다.
보스를 위해 일을 시작하십시오! 열심히 일합니다 ...
청취 방법이 호출되었습니다. 다음 개발에서는이 주석을 사용하여 리스너를 등록 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.