使用@PostConstruct时,applicationContext为空的解决办法

        以下顺序为现象-》解决方法-》原因-》复现过程

现象

        在被@PostConstrust注解注释的接口中,使用自建SpringUtils,服务无法启动,报告NPE(Null Pointer Exception:空指针异常)。

解决方法

        推荐解决方法是改用ApplicationRunner/CommandLineRunner的方式来替代@PostConstruct实现需求,此两者最终实现效果与@PostConstruct相同,且可使用@AutoWired注解来直接获取Bean。

原因

        在spring服务启动过程中,spring会先去注册所有的bean,在注册过程中,如果发现该bean中包涵了被@PostConstruct注释的函数,那么就会先去执行这个函数,然后再继续注册其他未注册的bean。但是在springUtils中,无论是继承ApplicationListener,还是继承自ApplicationContextAware,都只有在bean初始化完成后,才会执行注入applicationContext。

复现过程

SpringUtils.java

public class SpringUtils implements ApplicationListener<ApplicationEvent> {
	private static ApplicationContext applicationContext;
	
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

	public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextRefreshedEvent) {
            ContextRefreshedEvent e = (ContextRefreshedEvent)event;
            if (e.getApplicationContext().getParent() == null) {
                applicationContext = e.getApplicationContext();
            }
        }
    }

	public static <T> T getBean(Class<T> clazz){
		return getApplicationContext().getBean(clazz);
	}
}

TestService.java(为减少测试代码量,不使用接口模式)

@Service
public class TestService{
}

TestInit.java

@Component
public class TestInit{
	@PostConstruct
	public void init(){
		SpringUtils.getBean(TestService.class);
	}
}

结果:
        空指针异常
报错信息

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值