이벤트는 실제로 우리가 보내려는 메시지 본문입니다. 이는 일반적으로 실제 비즈니스에 따라 어떤 유형의 데이터를 사용할지, 어떤 필드를 추가할지에 따라 캡슐화되어야 합니다. 필요에 따라. 사례를 들어보겠습니다.
package com.lsqingfeng.springboot.applicationEvent; import lombok.Getter; import lombok.Setter; import org.springframework.context.ApplicationEvent; /** * @className: MyApplicationEvent * @description: 事件封装 * @author: sh.Liu * @date: 2022-03-23 14:41 */ @Getter @Setter @ToString public class MyApplicationEvent extends ApplicationEvent { private Integer age; private String name; /** * 需要重写构造方法 * @param source * @param name * @param age */ public MyApplicationEvent(Object source, String name, Integer age) { super(source); this.name = name; this.age = age; } }
리스너는 MQ의 소비자와 동일합니다. 푸시할 시간이 되면 리스너 코드가 실행될 수 있습니다. 여기서는 제네릭을 통해 이벤트 유형을 설정합니다.
package com.lsqingfeng.springboot.applicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; /** * @className: MyApplicationEventListener * @description:事件监听器 * @author: sh.Liu * @date: 2022-03-23 14:50 */ @Component public class MyApplicationEventListener implements ApplicationListener<MyApplicationEvent> { @Override public void onApplicationEvent(MyApplicationEvent event) { System.out.println("收到消息:" + event); } }
푸시 이벤트에는 ApplicationEventPublisher를 사용해야 합니다. 이 객체는 Spring 컨테이너가 로드될 때 이미 컨테이너에 있습니다. 따라서 ApplicationContext 자체가 ApplicationEventPublisher를 상속하므로 이를 직접 주입하거나 ApplicationContext를 사용할 수 있습니다. Controller를 통해 확인해 보겠습니다.
package com.lsqingfeng.springboot.controller; import com.lsqingfeng.springboot.applicationEvent.MyApplicationEvent; import com.lsqingfeng.springboot.base.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @className: ApplicationEventController * @description: * @author: sh.Liu * @date: 2022-03-23 15:21 */ @RestController @RequestMapping("event") public class ApplicationEventController { @Autowired private ApplicationContext applicationContext; @RequestMapping("/push") public Result pushEvent(){ MyApplicationEvent myApplicationEvent = new MyApplicationEvent(this,"zhangsan", 10); applicationContext.publishEvent(myApplicationEvent); return Result.success(); } @RequestMapping("/push3") public Result pushEvent2(){ applicationContext.publishEvent("大家好"); return Result.success(); } }
두 가지 푸시 방법을 정의합니다. 하나는 MyApplicationEvent 유형을 푸시하고 다른 메서드는 문자열을 푸시합니다.
첫 번째 메소드를 호출하면 콘솔은 우리가 푸시한 데이터 정보를 인쇄할 수 있습니다.
푸시 문자열을 호출할 때 인터셉터가 일반 MyApplicationEvent를 추가했기 때문에 리스너는 실행되지 않습니다. 이는 MyApplicationEvent 유형의 메시지만 수신한다는 의미입니다. 다른 유형의 메시지는 청취되지 않습니다.
제네릭을 없애면 어떤 효과가 있을까요?
모든 푸시는 두 개의 메시지를 보내지만(일부 내부 메커니즘이 있을 수 있으므로 상관 없음) 둘 다 인쇄됩니다. 즉, 일반 항목을 추가하지 않으면 누가 푸시하든 메시지는 다음과 같습니다. 여기에서 받았습니다.
위의 인터페이스를 구현하여 리스너를 개발하는 것 외에도 주석을 통해 구현할 수도 있습니다.
package com.lsqingfeng.springboot.applicationEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; /** * @className: MyApplicationEventListener2 * @description: 注解实现监听器 * @author: sh.Liu * @date: 2022-03-23 15:56 */ @Component public class MyApplicationEventListener2 { @EventListener public void onEvent(MyApplicationEvent event){ System.out.println("收到消息2:" + event); } }
여기에 @EventListener 주석이 추가되어 이것이 리스너임을 나타냅니다. 메소드 이름은 임의적이며 메소드의 매개변수는 모니터링할 이벤트 유형을 나타냅니다.
push 메소드를 다시 호출합니다:
두 청취자의 데이터가 인쇄되는 것으로 나타났습니다. 누구나 이 기능에 주목해야 합니다.
위 내용은 SpringBoot에서 ApplicationEvent와 ApplicationListener를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!