提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
首先了解一下 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 拦截器
看一下我的控制台
可以看到我这里已经成功监听到了