Spring手动注入bean时由于没有依赖造成空指针的解决

由于之前使用websocket的时候,需要使用容器中的bean,而websocket是多例模式,所以无法从bean中获取(准确的说是注入了,但是只有第一次注入成功了,以后的每次连接到来都是一个新的对象,所以里面没有完成ioc的注入);

我这里使用了手动从spring容器中getBean的方法拿数据;

@Component
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtil.applicationContext = applicationContext;
    }

    public ApplicationContext getApplicationContext(){
        return applicationContext;
    }

    public static Object getBean(String beanName){
        return applicationContext.getBean(beanName);
    }

    public static <T> T getBean(Class<T> clazz){
        return (T)applicationContext.getBean(clazz);   //打包以后这里会报空指针
    }
}

程序执行正常,但是打包以后运行,提示。getBean空指针,追了一下,是上面执行初始化的时候并没有执行set方法;然后就执行get,所以空指针。我捕获以后。发现过一会。还是会执行set方法,证明是有注入的,只是顺序出了问题。原来的程序能执行只是恰巧在那之前执行了set的初始化;

所以肯定是依赖出了问题,,突然想到我这是手动注入并没有依赖关系,所以顺序完全看运气,。。。所以我把调用这个方法的类改成了懒加载,等到需要的时候再加载。不会在初始化的时候就被加载,让set先执行。。。总之这不是一个好方法。建议使用别的方案处理websocket;

由于set方法实现了接口ApplicationContextAware
我们可以在启动类拿到执行run的返回值,手动调用这个set方法,传入返回值进行手动初始化请添加图片描述
请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值