欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot-事件监听

程序员文章站 2022-05-02 12:06:48
...

本文的核心内容:Spring Boot 提供的五种事件,自定义事件。


 

注入Maven依赖

<dependencies>     
    <dependency>         
        <groupId>org.springframework.boot</groupId>         
        <artifactId>spring-boot-starter</artifactId>     
    </dependency>
</dependencies>

SpringBoot 提供的五种事件

ApplicationStartedEvent     springboot启动开始的时候执行的事件,在该事件中可以获取到SpringApplication对象,可做一些执行前的设置。

ApplicationEnvironmentPreparedEvent  spring boot 对应Enviroment已经准备完毕,但此时上下文context还没有创建。在该监听中获取到ConfigurableEnvironment后可以对配置信息做操作。

ApplicationPreparedEvent     spring boot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。在获取完上下文后,可以将上下文传递出去做一些额外的操作。值得注意的是:在该监听器中是无法获取自定义bean并进行操作的。

ApplicationFailedEvent         spring boot启动异常时执行事件,在异常发生时,最好是添加虚拟机对应的钩子进行资源的回收与释放,能友善的处理异常信息

ApplicationReadyEvent         springboot 加载完成时候执行的事件

我们需要自定义监听器,实现我们需要的事件   调用初始化方法。

//这里我们监听的是Spring Boot 项目加载完成后的事件
 @Component 
public class MyApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent>{ 
    @Override 
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
         //事件触发时执行的业务逻辑 
    } 
}

 

SpringBoot自定事件

定义事件【事件可以含有各种属性方法等等】

/**
* 定义事件
*
*/
import org.springframework.context.ApplicationEvent;

public class MyEvent extends ApplicationEvent {
    public MyEvent(Object source) {
        super(source);
    }
}

定义监听器监听自定义事件【事件发生时,触发某种操作】



import org.springframework.context.ApplicationListener;

@Component
public class MyApplicationListener implements ApplicationListener<MyEvent> {

    public void onApplicationEvent(MyEvent event) {
        System.out.println("接收到事件:"+event.getClass());
    }

}

 

发布事件

1)事件接口服务方式

public interface MyEventService{
    public void publish(Object obj);
}

2)事件接口服务实现类

import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

@Service
public class MyEventServiceImpl implements MyEventService{
    /**
     *  上下文对象
     */
    @Resource
    private ApplicationContext applicationContext;

    @Override
    public void publish(Object obj) {
       
        //通过上下文对象发布监听
        applicationContext.publishEvent(new MyEvent(obj));
    }
}

通过注入MyEventService,在需要触发事件的时候调用publish方法即可。