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
相关产品推荐
相关产品推荐

