You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring的@Configuration类所有Bean加载后执行指定方法?

Spring配置类中所有Bean加载完成后执行方法的实现方案

下面提供几种可行的实现方式,按需选择:

方法一:实现SmartInitializingSingleton接口

Spring的SmartInitializingSingleton接口专门用于所有单例Bean完成实例化、依赖注入和初始化后触发回调,完全匹配需求。只需让Config类实现该接口,重写方法并调用目标方法即可:

@Configuration
public class Config implements SmartInitializingSingleton {

    @Bean
    public BeanA beanA() {
        // ...
        return beanA;
    }
    
    @Bean
    public BeanB beanB() {
        // ...
        return beanB;
    }
    
    // ...
    
    @Bean
    public BeanN beanN() {
        // ...
        return beanN;
    }

    public void executeAfterAllBeans() {
        // some code
    }

    @Override
    public void afterSingletonsInstantiated() {
        // 所有单例Bean加载完成后执行
        executeAfterAllBeans();
    }
}

方法二:监听ContextRefreshedEvent事件

通过监听Spring容器的ContextRefreshedEvent事件,在容器刷新完成(所有Bean加载就绪)时执行目标方法。注意如果存在父子容器(如Spring MVC与Spring Boot容器),需要添加判断避免重复触发:

@Configuration
public class Config implements ApplicationListener<ContextRefreshedEvent> {

    @Bean
    public BeanA beanA() {
        // ...
        return beanA;
    }
    
    @Bean
    public BeanB beanB() {
        // ...
        return beanB;
    }
    
    // ...
    
    @Bean
    public BeanN beanN() {
        // ...
        return beanN;
    }

    public void executeAfterAllBeans() {
        // some code
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 仅处理根容器的刷新事件,避免父子容器重复执行
        if (event.getApplicationContext().getParent() == null) {
            executeAfterAllBeans();
        }
    }
}

方法三:结合@PostConstruct与事件监听

如果不想让Config类直接实现监听器接口,也可以在@PostConstruct方法中动态添加事件监听器:

@Configuration
public class Config {

    @Autowired
    private ApplicationContext applicationContext;

    @Bean
    public BeanA beanA() {
        // ...
        return beanA;
    }
    
    @Bean
    public BeanB beanB() {
        // ...
        return beanB;
    }
    
    // ...
    
    @Bean
    public BeanN beanN() {
        // ...
        return beanN;
    }

    public void executeAfterAllBeans() {
        // some code
    }

    @PostConstruct
    public void registerListener() {
        applicationContext.addApplicationListener((ApplicationListener<ContextRefreshedEvent>) event -> {
            if (event.getApplicationContext().getParent() == null) {
                executeAfterAllBeans();
            }
        });
    }
}

推荐说明

优先选择方法一,因为SmartInitializingSingleton是Spring专门为单例Bean全部初始化完成后提供的回调接口,逻辑更直接,无需处理容器层级的额外判断,代码更简洁。

内容的提问来源于stack exchange,提问作者IceMajor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:07:28