使用ApplicationListener监听使方法仅在项目启动时执行一次

原理分析

CommandLineRunner和ApplicationListener原理分析

使用场景

springCloud项目ApplicationListener 监听某个方法仅在启动时执行一次
业务中需要某个方法仅在启动时执行一次。
在一些业务场景中,当容器初始化完成之后,需要处理一些操作,比如一些数据的加载、初始化缓存、特定任务的注册等等。这个时候我们就可以使用Spring提供的ApplicationListener来进行操作。

用法

本文以在Spring boot下的使用为例来进行说明。首先,需要实现ApplicationListener接口并实现onApplicationEvent方法。把需要处理的操作放在onApplicationEvent中进行处理:

contextRefreshedEvent.getApplicationContext().getParent() == null

这样其他容器的初始化就会直接返回,而父容器(Parent为null的容器)启动时将会执行相应的业务操作。

关联知识

在spring中InitializingBean接口也提供了类似的功能,只不过它进行操作的时机是在所有bean都被实例化之后才进行调用。根据不同的业务场景和需求,可选择不同的方案来实现。

package com.dawn.service;

import com.dawn.dao.NewsMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SearchReceive implements ApplicationListener<ContextRefreshedEvent> {
    private static Logger logger = LoggerFactory.getLogger(SearchReceive.class);
    @Autowired
    private NewsMapper newsMapper;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        if (contextRefreshedEvent.getApplicationContext().getParent() == null) {//保证只执行一次
            //需要执行的方法
            int total = newsMapper.countTotal();
            List list = newsMapper.getNews();
            logger.info("只执行一次的方法:{}", total);
        }
    }

}

在Spring框架中,我们可以通过实现ApplicationListener接口来监听Spring容器的事件,从而在特定事件发生时执行一些特定的处理。 例如,在项目启动时我们可能需要进行一些初始化操作,比如读取配置文件、连接数据库等等。此时,我们可以实现ApplicationListener接口,在onApplicationEvent方法中编写初始化逻辑。 下面是一个简单的示例代码: ```java @Component public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { // 在Spring容器初始化完成后执行 // 这里可以写一些项目启动时的初始化逻辑 System.out.println("项目启动完成,执行初始化操作..."); } } ``` 在上面的代码中,我们使用@Component注解将MyApplicationListener类纳入Spring容器的管理中,并实现了ApplicationListener接口,并指定了监听的事件类型为ContextRefreshedEvent,这是Spring容器初始化完成后会发布的事件。 当Spring容器初始化完成后,就会自动触发onApplicationEvent方法执行我们在其中编写的初始化逻辑。 除了ContextRefreshedEvent事件,Spring容器还支持许多其他事件类型,例如ContextStartedEvent(容器启动时触发)、ContextStoppedEvent(容器停止时触发)等等。我们可以根据具体需求选择不同的事件类型来监听。 在底层实现上,Spring容器会通过调用ConfigurableApplicationContext.publishEvent()方法来发布事件,然后遍历所有实现了ApplicationListener接口的bean,并调用它们的onApplicationEvent()方法来处理相应的事件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值