>  기사  >  Java  >  SpringBoot에서 ApplicationEvent와 ApplicationListener를 사용하는 방법

SpringBoot에서 ApplicationEvent와 ApplicationListener를 사용하는 방법

PHPz
PHPz앞으로
2023-05-13 19:46:09993검색
이 모델에는 두 가지 중요한 수업이 있습니다. 하나는 이벤트이고 다른 하나는 듣기입니다. 이벤트는 ApplicationEvent 클래스를 상속해야 하며 모니터링은 ApplicationListener 인터페이스를 구현해야 합니다.

1. 애플리케이션 이벤트 개발

이벤트는 실제로 우리가 보내려는 메시지 본문입니다. 이는 일반적으로 실제 비즈니스에 따라 어떤 유형의 데이터를 사용할지, 어떤 필드를 추가할지에 따라 캡슐화되어야 합니다. 필요에 따라. 사례를 들어보겠습니다.

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;
    }
}

2. 리스너 개발

리스너는 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);
    }
}

3. 푸시 이벤트

푸시 이벤트에는 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 유형을 푸시하고 다른 메서드는 문자열을 푸시합니다.

첫 번째 메소드를 호출하면 콘솔은 우리가 푸시한 데이터 정보를 인쇄할 수 있습니다.

SpringBoot에서 ApplicationEvent와 ApplicationListener를 사용하는 방법

푸시 문자열을 호출할 때 인터셉터가 일반 MyApplicationEvent를 추가했기 때문에 리스너는 실행되지 않습니다. 이는 MyApplicationEvent 유형의 메시지만 수신한다는 의미입니다. 다른 유형의 메시지는 청취되지 않습니다.

제네릭을 없애면 어떤 효과가 있을까요?

SpringBoot에서 ApplicationEvent와 ApplicationListener를 사용하는 방법

모든 푸시는 두 개의 메시지를 보내지만(일부 내부 메커니즘이 있을 수 있으므로 상관 없음) 둘 다 인쇄됩니다. 즉, 일반 항목을 추가하지 않으면 누가 푸시하든 메시지는 다음과 같습니다. 여기에서 받았습니다.

4. 주석을 통한 리스너 구현

위의 인터페이스를 구현하여 리스너를 개발하는 것 외에도 주석을 통해 구현할 수도 있습니다.

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를 사용하는 방법

두 청취자의 데이터가 인쇄되는 것으로 나타났습니다. 누구나 이 기능에 주목해야 합니다.

위 내용은 SpringBoot에서 ApplicationEvent와 ApplicationListener를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제