@EventListener注解是干什么的

@EventListener 是 Spring Framework 4.2 引入的一个注解,用于将方法声明为事件处理器,可以用于监听和响应应用程序中发布的事件。

使用 @EventListener 注解的方法应该定义在一个由 Spring 管理的 Bean 中。当一个事件被发布时,Spring 会查找 Bean 中用 @EventListener 注解的方法,如果这个方法能够处理这个事件,那么就会执行这个方法。

@EventListener注解的简单用法

下面是一个简单的例子:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class MyEventListener {

    @EventListener
    public void handleEvent(MyEvent event) {
        // 处理事件的逻辑
    }
}

在这个例子中,handleEvent 方法通过 @EventListener 注解标记为一个事件处理器。当 MyEvent 事件发布时,Spring 会调用这个方法。

@EventListener 注解还支持条件过滤和优先级设置,以便更细粒度地控制事件处理的执行。

@EventListener(condition = "#myEvent.isImportant()")
public void handleImportantEvent(MyEvent myEvent) {
    // 只处理重要事件
}

在上面的代码中,condition 属性用于指定一个 SpEL 表达式,当表达式结果为 true 时,才会执行 handleImportantEvent 方法。

@EventListener 注解也可以用于注册一个方法作为 AOP 切面,用于处理通知。

@EventListener
public void afterReturningAdvice(MyEvent myEvent) {
    // 后置通知逻辑
}

在这个例子中,afterReturningAdvice 方法将在目标方法成功返回后被调用。

@EventListener注解的原理

我们可以点进去@EventListener这个注解里面去看一看,如下图所示,可以看到这个注解上面有一大堆的描述,从描述中我们可以猜到这个注解的内部工作原理。

@EventListener注解是干什么的

描述中有一个醒目的字眼,即参考EventListenerMethodProcessor。意思可能是说,如果你想搞清楚@EventListener注解的内部工作原理,那么可以参考EventListenerMethodProcessor这个类。
EventListenerMethodProcessor是一个处理器,其作用是来解析方法上的@EventListener注解的。这也就是说,Spring会使用EventListenerMethodProcessor来解析方法上的@EventListener注解。因此,搞清楚这个处理器是怎样工作的,就搞清楚了@EventListener注解的内部工作原理。

@EventListener注解是干什么的
@EventListener注解是干什么的

仔细看一下SmartInitializingSingleton接口中afterSingletonsInstantiated方法上面的描述信息,不难看出该方法是在所有的单实例bean已经全部被创建完了以后才会被执行。
在介绍SmartInitializingSingleton接口的时候,我们也能从描述信息中知道,在所有的单实例bean已经全部被创建完成以后才会触发该接口。紧接着下面一段的描述还说了,该接口的调用时机有点类似于ContextRefreshedEvent事件,即在容器刷新完成以后,便会回调该接口。也就是说,这个时候容器已经创建完了。
如果所有的单实例bean都已经创建完了,也就是说下面这一步都执行完了,那么说明IOC容器已经创建完成了。

@EventListener注解是干什么的

紧接着便会来调用finishRefresh方法,容器已经创建完了,此时就会来发布容器已经刷新完成的事件。这就呼应了开头的那句话,即SmartInitializingSingleton接口的调用时机有点类似于ContextRefreshedEvent事件,即在容器刷新完成以后,便会回调该接口。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/261522.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!