Spring+ ApplicationListener

本文介绍如何使用Spring框架的ApplicationListener接口实现容器初始化后的操作。通过创建AviatorRegisterConfigue类并实现ContextRefreshedEvent事件监听,可以在Spring上下文加载完成后执行特定任务,如加载代码字典到缓存。

有时候 需要在容器初始化完成后,加载些 代码字典或不常变的信息  放入缓存之类的,这里使用spring 初始化bean,并实例化

1.创建一个ApplicationListener类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;


@Component("aviatorRegisterConfigue")
public class AviatorRegisterConfigue implements ApplicationListener<ContextRefreshedEvent> {// ContextRefreshedEvent为初始化完毕事件,spring还有很多事件可以利用
    private static final Logger LOG = LoggerFactory.getLogger(AviatorRegisterConfigue.class);
    
    /**
     * 当一个ApplicationContext被初始化或刷新触发
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if (event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")) {
                        
            //放入代码字典操作
            LOG.info("redis缓存加载成功"); 
        }
    }

}

特别注意 event.getApplicationContext().getDisplayName().equals("Root WebApplicationContext")  这里是防止 初始化完成 操作执行2次,原因是

在web 项目中(spring mvc),系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet  context(作为root application context的子容器)。

这种情况下,就会造成onApplicationEvent方法被执行两次。

转载于:https://www.cnblogs.com/zwdx/p/8393099.html

<think>我们是在讨论Spring框架中的ApplicationListener的使用。根据引用内容,ApplicationListenerSpring提供的一个监听器接口,用于实现发布-订阅模式。当某个事件(ApplicationEvent)发布时,监听该事件的ApplicationListener会被触发。 在Spring Web项目中,我们可以通过以下步骤使用ApplicationListener: 1. **定义事件**:创建自定义事件类,继承ApplicationEvent。 2. **定义监听器**:创建类实现ApplicationListener接口,并指定监听的事件类型;或者使用@EventListener注解。 3. **发布事件**:在需要触发事件的地方,使用ApplicationContext发布事件。 下面我们结合代码示例来说明。 ### 步骤1:定义自定义事件 假设我们有一个用户注册成功的事件,我们可以这样定义: ```java public class UserRegisteredEvent extends ApplicationEvent { private String username; public UserRegisteredEvent(Object source, String username) { super(source); this.username = username; } public String getUsername() { return username; } } ``` ### 步骤2:定义监听器 有两种方式定义监听器: **方式一:实现ApplicationListener接口** ```java @Component public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> { @Override public void onApplicationEvent(UserRegisteredEvent event) { // 处理事件,例如发送欢迎邮件 System.out.println("Sending welcome email to: " + event.getUsername()); } } ``` **方式二:使用@EventListener注解(更简洁)** ```java @Component public class UserRegisteredListener { @EventListener public void handleUserRegisteredEvent(UserRegisteredEvent event) { // 处理事件 System.out.println("Sending welcome email to: " + event.getUsername()); } } ``` ### 步骤3:发布事件 在需要触发事件的地方(例如用户注册服务中),注入ApplicationContext并发布事件: ```java @Service public class UserService { @Autowired private ApplicationContext applicationContext; public void registerUser(String username) { // 注册用户的逻辑... System.out.println("User registered: " + username); // 发布用户注册事件 applicationContext.publishEvent(new UserRegisteredEvent(this, username)); } } ``` ### 注意事项 - 事件监听器默认是同步执行的,即发布事件的线程会等待所有监听器处理完成。如果需要异步执行,可以在监听器方法上添加`@Async`注解,并启用Spring的异步支持(在配置类上添加`@EnableAsync`)。 - 监听器可以通过实现`SmartApplicationListener`接口来指定监听多个事件或根据条件执行。 ### 在Web项目中的配置 确保Spring能够扫描到事件和监听器所在的包,通常通过`@ComponentScan`实现。在Spring Boot项目中,主类上默认有`@SpringBootApplication`注解,它包含了`@ComponentScan`。 ### 示例总结 通过以上步骤,我们实现了在用户注册成功后发布事件,然后由监听器处理发送欢迎邮件的逻辑。这样可以将业务逻辑解耦,使代码更加清晰。 §§相关问题§§ 1. Spring中的ApplicationListener和ApplicationEvent有什么关系? 2. 如何实现ApplicationListener的异步处理? 3. 除了自定义事件,Spring内置了哪些常用的事件? 4. 在Spring Boot中如何使用ApplicationListener? 5. 如何通过SmartApplicationListener实现更灵活的事件监听? 以上内容参考了提供的引用[^1][^2][^4][^5]。</think>在Spring Web项目中使用`ApplicationListener`实现监听器功能,主要涉及定义事件、创建监听器和发布事件三个核心步骤。以下是详细实现指南: --- ### 1. **定义自定义事件类** 创建继承`ApplicationEvent`的事件类,用于封装业务数据: ```java public class OrderCreateEvent extends ApplicationEvent { private String orderId; public OrderCreateEvent(Object source, String orderId) { super(source); this.orderId = orderId; } public String getOrderId() { return orderId; } } ``` --- ### 2. **实现事件监听器** #### 方式一:实现`ApplicationListener`接口 ```java @Component public class OrderEventListener implements ApplicationListener<OrderCreateEvent> { @Override public void onApplicationEvent(OrderCreateEvent event) { // 业务处理:发送通知、更新库存等 System.out.println("订单创建事件监听: 订单ID=" + event.getOrderId()); } } ``` #### 方式二:使用`@EventListener`注解(推荐) ```java @Component public class OrderEventListener { @EventListener public void handleOrderEvent(OrderCreateEvent event) { System.out.println("@EventListener监听: 订单ID=" + event.getOrderId()); } } ``` --- ### 3. **发布事件** 在业务逻辑中注入`ApplicationContext`并发布事件: ```java @Service public class OrderService { @Autowired private ApplicationContext applicationContext; public void createOrder(String orderId) { // 1. 创建订单核心逻辑 System.out.println("创建订单: " + orderId); // 2. 发布事件 applicationContext.publishEvent(new OrderCreateEvent(this, orderId)); } } ``` --- ### 4. **异步事件处理** 通过`@Async`实现异步监听(需启用异步支持): ```java @Configuration @EnableAsync // 启用异步支持 public class AsyncConfig { ... } @Component public class AsyncEventListener { @Async @EventListener public void asyncHandle(OrderCreateEvent event) { // 异步执行的耗时操作 System.out.println("异步处理订单事件: " + event.getOrderId()); } } ``` --- ### 关键机制说明 1. **事件传播** Spring会自动将事件传递给所有匹配的监听器,无需手动注册[^1][^5]。 2. **监听器优先级** 使用`@Order`注解控制执行顺序: ```java @EventListener @Order(1) // 数字越小优先级越高 public void highPriorityHandler(OrderCreateEvent event) { ... } ``` 3. **条件监听** 通过SpEL表达式过滤事件: ```java @EventListener(condition = "#event.orderId.startsWith('VIP')") public void handleVIPOrder(OrderCreateEvent event) { ... } ``` --- ### 实际应用场景 - **订单系统**:订单状态变更时触发库存更新、通知推送 - **用户服务**:用户注册后发送验证邮件、初始化账户 - **审计日志**:关键操作触发日志记录 > 提示:Spring内置了`ContextRefreshedEvent`(容器刷新)、`RequestHandledEvent`(请求完成)等事件,可直接监听[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值