Spring事件监听发布与bean的生命周期

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)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值