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

Spring listener——Spring boot实现监听器的两种方式

程序员文章站 2022-03-02 18:29:43
...

我们知道,在spring启动的过程中,会生成很多的监听器,监听整个spring容器的生命周期。那么,我们想要生成自己的listener需要怎么做呢?今天,就给大家带来spring boot实现监听器的两种方式。

自定义事件

自定义事件XiaoAMaCreatedEvent继承ApplicationEvent类

/**
 * [说明]
 *
 * @author xiaoama
 */
public class XiaoAMaCreatedEvent extends ApplicationEvent {

    private String message;

    public XiaoAMaCreatedEvent(Object source) {
        super(source);
    }


    public XiaoAMaCreatedEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

自定义监听器-listener

今天给大家带来两种自定义监听器的创建方式。

方式一

实现ApplicationListener接口,泛型参数传入我们自定义的event事件

/**
 * [说明]
 *
 * @author xiaoama
 */
@Component
public class XiaoAMaListener implements ApplicationListener<XiaoAMaCreatedEvent> {

    @Override
    public void onApplicationEvent(XiaoAMaCreatedEvent event) {
        String message = event.getMessage();
        System.out.println("接受到acceount创建,正在发送创建信息:"+message);
    }
}

方式二

自定义listener类,提供监听的方法processAccountCreatedEvent(方法名可以自定义),接受一个自定义的event事件作为参数,同时添加注解 @EventListener

/**
 * [说明]
 *
 * @author xiaoama
 */
@Component
public class XiaoAMaListener {

    @EventListener
    public void processAccountCreatedEvent(XiaoAMaCreatedEvent event){
        String message = event.getMessage();
        System.out.println("接受到acceount创建,正在发送创建信息:"+message);
    }
}

发布监听事件

可以通过应用上下文applicationcontext的publishEvent方法发布一个监听事件,在启动日志中就能看到我们的监听器的打印日志

@SpringBootApplication
public class App 
{
    public static void main( String[] args )

    {
        //创建一个可执行的spring应用程序
        SpringApplication application = new SpringApplication(App.class);

        ConfigurableApplicationContext context =application.run(args);
  
        context.publishEvent(new XiaoAMaCreatedEvent(new Object(),"create success"));

    }
}

监听器打印日志

2020-11-17 11:02:43.689 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8099 (http) with context path ''
2020-11-17 11:02:43.693 [main] INFO  org.example.App - Started App in 9.453 seconds (JVM running for 12.396)
接受到acceount创建,正在发送创建信息:create success
2020-11-17 11:02:43.704 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Shutting down ExecutorService 'applicationTaskExecutor'

或者可以通过引入ApplicationEventPublisher,在我们的方法内部发布一个监听事件。

@RestController
public class XiaoAMaController  {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

	@GetMapping(value = "/createUser")
    public User create() {
        User user = new CacheUser(); 
        user.setName("xiaoama");
        user.setId(1);
        user.setAddress("cd");
        applicationEventPublisher.publishEvent(new XiaoAMaCreatedEvent(user,"create account success"));
        return user;
    }
}

通过postman调用createUser接口,也可以看到同样的打印信息,表明我们的监听器已经成功的注册到spring的上下文容器中。