Spring事件监听处理与事件发布
1.Spring事件监听处理
Spring框架提供了事件驱动编程模型,通过事件监听器(Event Listeners)来处理和响应应用程序中的事件
1.1监听处理start事件
创建处理事件类,实现监听接口并泛型start事件类,重写监听回调方法,注册处理类bean实例
//1.创建处理事件类,实现Listener接口并泛型Start事件类
public class AppStartHandle implements ApplicationListener<ContextStartedEvent>
{
//此方法就是监听start事件的回调处理方法
@Override
public void onApplicationEvent(ContextStartedEvent event)
{
System.out.println("容器已经启动完毕");
}
}
//注册处理类bean实例
@Configuration
public class HandleConfig
{
@Bean
public AppStartHandle appStartHandle()
{
return new AppStartHandle();
}
}
//运行
public class RunTest
{
public static void main(String[] args)
{
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HandleConfig.class);
//启动容器
context.start();
}
}
当调用start方法后,事件监听器会监听到start事件,并回调处理方法
此时输出
容器已经启动完毕
1.2监听处理stop事件
//1.创建处理事件类,实现Listener接口并泛型stop事件类
public class AppStopHandle implements ApplicationListener<ContextStoppedEvent>
{
@Override
public void onApplicationEvent(ContextStoppedEvent contextStoppedEvent)
{
System.out.println("容器已经停止了");
}
}
//注册处理类的bean实例
@Configuration
public class HandleConfig
{
@Bean
public AppStopHandle appStopHandle()
{
return new AppStopHandle();
}
}
//运行
public class RunTest
{
public static void main(String[] args)
{
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HandleConfig.class);
//关停容器
context.stop();
}
}
此时输出
容器已经停止了
2.事件发布
在应用程序中,当某个事件发生时,需要有一个事件发布者来发布该事件。事件发布者是一个Spring Bean,负责发布事件给对应的事件监听器
//创建自定义事件类,需要继承ApplicationEvent父类
public class ShowDateEvent extends ApplicationEvent
{
//事件对象创建方式,默认使用容器的方法统一处理
public ShowDateEvent(Object source)
{
super(source);
}
}
//创建事件处理器,实现事件监听接口并泛型需要处理的自定义事件类
public class ShowDateEventHandle implements ApplicationListener<ShowDateEvent>
{
//监听自定义事件的回调处理方法
@Override
public void onApplicationEvent(ShowDateEvent showDateEvent) {
//打印当前时间
System.out.println(LocalDateTime.now());
}
}
//创建发布事件类,实现事件发布接口
public class EventPublisher implements ApplicationEventPublisherAware
{
//创建属性为事件发布者对象
private ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher)
{ //给事件发布者对象属性赋值
this.publisher = publisher;
}
//事件发布的方法
public void publish()
{
//执行事件发布
this.publisher.publishEvent(new ShowDateEvent(this));
}
}
//注册事件发布类bean实例
@Configuration
public class HandleConfig
{
@Bean
public EventPublisher eventPublisher()
{
return new EventPublisher();
}
}
//运行
public class RunTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cconfig.class);
EventPublisher eventPublisher = (EventPublisher) context.getBean("eventPublisher");
//每发布一次就会监听处理一次事件
eventPublisher.publish();
eventPublisher.publish();
}
}
此时输出
2023-08-15T12:31:43.878
2023-08-15T12:31:43.878
通过调用事件发布者的publishEvent()方法来发布事件,Spring框架会自动将该事件发送给所有对应的监听器
注意:自定义事件类无需注册bean,因为继承的ApplicationEvent父类会注册,并且事件对象创建方式,默认使用容器统一处理
3.bean的生命周期,容器启动过程
bean的生命周期:
1.初始化阶段 init-method
2.使用阶段
3.销毁阶段 destroy-method
//学生类
@Data
public class Student
{
private String name;
@PostConstruct//bean初始化阶段
public void initName()
{
System.out.println("bean开始初始化");
this.name = "milo";
}
@PreDestroy//bean销毁阶段
public void destroy(){
System.out.println("bean已经销毁了");
}
}
//测试类
public class RunTest
{
public static void main(String[] args)
{
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cconfig.class);
System.out.println(context.getBean("student"));
//停止容器,IOC容器停止后会销毁所有bean
context.close();
}
}
此时输出
bean开始初始化
Student(name=milo)
bean已经销毁了
总结:
容器启动过程:
1.资源(bean配置)定位
2.资源加载
3.bean的初始化
4.属性填充(依赖注入)
5.初始化事件发布
6.init初始化(getBean)