扩展原理——@EventListener与SmartInitializingSingleton

一、@EventListener注解

使用@EventListener注解可以使得任何方法实现监听

@Service
public class UserService {

    @EventListener(classes = {ApplicationEvent.class})
    public void listen(ApplicationEvent event){
        System.out.println("UserService监听事件:" + event);

    }
}

测试

    @Test
    public void testExtension(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigOfExtension.class);

        context.publishEvent(new ApplicationEvent(new String("发布的事件")) {});

        context.close();

    }

打印结果:
在这里插入图片描述

二、@EventListener注解实现原理——SmartInitializingSingleton

使用EventListenerMethodProcessor处理器来解析方法上的@EventListener注解

EventListenerMethodProcessor处理器实现了SmartInitializingSingleton接口
在这里插入图片描述
SmartInitializingSingleton接口中的afterSingletonsInstantiated()方法会在所有的单实例bean创建完成之后调用
在这里插入图片描述
首先ioc容器创建对象,并刷新容器
在这里插入图片描述
refresh()方法调用finishBeanFactoryInitialization(beanFactory)完成bean的初始化工作
在这里插入图片描述
finishBeanFactoryInitialization(beanFactory)方法调用preInstantiateSingletons()方法初始化单实例bean
在这里插入图片描述
preInstantiateSingletons()方法会先创建所有的单实例bean,然后遍历所有单实例bean并判断是否实现SmartInitializingSingleton接口,如果是则调用afterSingletonsInstantiated()方法
在这里插入图片描述
获取每个bean中标注@EventListener注解的方法,再通过EventListenerFactory创建ApplicationListener对象,再把这个ApplicationListener对象保存在applicationContext也就是ioc容器中
在这里插入图片描述
添加到容器中以后,会把它注册到派发器applicationEventMulticaster中,从而实现监听作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值