SpringBoot进行事件的监听和发布

SpringBoot进行事件的监听和发布

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


首先了解一下 ApplicationEventPublisherAware

ApplicationEventPublisherAware 是 Spring 框架中的一个接口,它允许 Bean 获取对 ApplicationEventPublisher 的引用,从而能够在 Bean 中发布应用事件。

我的理解是感觉与bean的Set 注入一样,既可以实现ApplicationEventPublisherAware 去重写它的setApplicationEventPublisher方法;也可以通过@Autowired 去注入ApplicationEventPublisher,两者效果差不多

通过implements ApplicationEventPublisherAware

package ***.example.demo.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.***ponent;
@***ponent
public class userRegistrationPublisher implements ApplicationEventPublisherAware {

	private ApplicationEventPublisher eventPulisher;
	@Override
	public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
		// TODO Auto-generated method stub
		this.eventPulisher=applicationEventPublisher;
	}
	public void publishEvent(String username) {
		event event= new event(this,username);
		eventPulisher.publishEvent(event);
	}

}




通过@Autowired 注入 ApplicationEventPublisher

package ***.example.demo.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.***ponent;
@***ponent
public class userRegistrationPublisher {
	@Autowired
	private ApplicationEventPublisher eventPulisher;
	
	public void publishEvent(String username) {
		event event= new event(this,username);
		eventPulisher.publishEvent(event);
	}

}

event 事件

通过extends ApplicationEvent 来自定义自己的event 事件

下面我还自定义一个自己的event

package ***.example.demo.utils;

import org.springframework.context.ApplicationEvent;

public class event extends ApplicationEvent {

   private String username;

   public event(Object source,String username) {
   	super(source);
   	// TODO Auto-generated constructor stub
   	this.username=username;
   }
   public String getUsername() {
   	return username;
   }
}

eventListener

上面我们已经定义了我们自己的 event 和ApplicationEventPublisher 事件发布,接下来是实现我们的事件监听

使用 @EventListener 注解

package ***.example.demo.utils;

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.***ponent;

@***ponent
public class Listener {
   
   @EventListener
   public void hand(event event) {
   	System.out.println("处理用户注册事件"+event.getUsername());
   }
}

hand 方法中的event event 是我们上面自定义的event 当然事件监听可以实现更加高级的用法这里我只让它打印了数据

使用ApplicationEventPublisher来发布event

package ***.example.demo.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import ***.example.demo.entity.Book;
import ***.example.demo.entity.User;
import ***.example.demo.entity.takeBook;
import ***.example.demo.service.BookCollectService;
import ***.example.demo.service.BookService;
import ***.example.demo.service.userService;
import ***.example.demo.utils.jwtUtils;
import ***.example.demo.utils.userRegistrationPublisher;

import jakarta.servlet.http.HttpServletRequest;

@RestController

@RequestMapping("/book")
public class bookController {
	@Autowired
	BookService service;
	@Autowired
	userRegistrationPublisher publisher;
	
	@GetMapping("/number")
	public int bookMount() {
		System.out.print("haode");
		publisher.publishEvent("成功了");
		return service.allbook().size();	
	}

我是在Controller层通过字段注入来获取了上面定义的userRegistrationPublisher publisher 在book/number 路由中通过publisher.publishEvent(“成功了”);来发布了事件

看一下运行结果

这里我使用了postMan 来测试了我的这个book/number Api,这个返回了一个json 数据表名了我的这个请求被拦截了,这个不要紧,只是因为我设置了一个token 拦截器

看一下我的控制台

可以看到我这里已经成功监听到了

转载请说明出处内容投诉
CSS教程网 » SpringBoot进行事件的监听和发布

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买