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

SpringBoot3开启懒初始化后,ApplicationAware类中ApplicationContext为空求助

问题原因分析

全局开启spring.main.lazy-initialization=true后,所有被@Component标注的Bean默认会被懒加载——只有当该Bean被依赖注入,或者主动从Spring容器中获取时,才会被实例化。

你的ApplicationContextProvider类虽然实现了ApplicationContextAware,但因为懒加载的特性,在你直接调用它的静态getBean方法时,这个类还没有被Spring实例化,setApplicationContext方法从未被执行,导致静态变量context始终为null,最终触发空指针异常。

解决方案

方案1:强制ApplicationContextProvider不参与懒加载

给ApplicationContextProvider添加@Lazy(false)注解,让Spring在容器启动时就实例化这个Bean,确保setApplicationContext被调用,静态context变量能被正确赋值:

@Component
@Lazy(false) // 强制该Bean跳过懒加载,启动时立即实例化
public class ApplicationContextProvider implements ApplicationContextAware {
    private static ApplicationContext context;

    public static <T> T getBean(String name, Class<T> aClass) {
        return context.getBean(name, aClass);
    }

    public static <T> T getBean(Class<T> aClass) {
        return context.getBean(aClass);
    }

    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        context = ctx;
    }
}

方案2:通过配置类手动注册Bean并关闭懒加载

如果不想在类上添加注解,也可以在配置类中手动注册ApplicationContextProvider,并指定不懒加载:

@Configuration
public class AppConfig {
    @Bean
    @Lazy(false)
    public ApplicationContextProvider applicationContextProvider() {
        return new ApplicationContextProvider();
    }
}

额外注意事项

  • 确保调用ApplicationContextProvider.getBean()的时机是在Spring容器初始化完成之后,比如在Controller的请求方法中、Service的业务方法中调用,避免在static代码块、类构造函数或者容器初始化阶段(比如@PostConstruct方法中过早调用)。
  • 如果只是需要获取Spring容器中的Bean,也可以直接在需要的类中通过@Autowired注入ApplicationContext,而非使用静态工具类,这是更符合Spring设计理念的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:50:18