一次autowired注入的对象为null问题排查

使用公司内部服务框架时,需要在过滤器中引入dao类,进行操作,但是使用注解autowire注入后是null,记录下排查过程

boot版本2.2

cloud版本2011

  1.  首先在引入dao的类初始化是否报错,即从applicationContext的getBean方法,是否抛出异常
  2. 检查autowire注解注入依赖bean的逻辑,即当前dao类初始化,postProcessProperties可以看到dao的meta信息,然后执行dao类的初始化
  3. dao的实例依赖了mybatisProperties,创建实例时,applyBeanPostProcessorsBeforeInitialization调用beanpostprocessors的postProcessBeforeInitialization方法processors是列表,依次调用执行。其中ConfigurationPropertiesBindingPostProcessor执行yml配置文件信息绑定到具体的属性类
  4. 绑定配置时执行defaultsBindHandlerAdvisor初始化并实例化他的factorybean ,CommonsConfigAutoConfiguration继续执行。postProcessBeforeInitialization里面初始化自定义的properties,此时又触发了属性绑定执行,最后报错
Could not bind properties to 'xxxClientConfigurationProperties' : prefix=xxx.client, ignoreInvalidFields=false, ignoreUnknownFields=true; 
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: 
Error creating bean with name 'defaultsBindHandlerAdvisor': Requested bean is currently in creation: Is there an unresolvable circular reference?

结论:在初始化实例过程中,属性绑定的执行触发了循环依赖。

排查过程总结

  • beanpostprocessor类不熟悉,完全没想到dao的初始化关系到一整个属性配置的加载
  • 思路问题:因为不熟悉就瞎猜,瞎猜就会绕远路,一个头两个大,不能冷静分析,无法直达问题核心
  • 循环依赖:网上有搜索的很多循环依赖的解决方法,比如set方法注入,修改processor的顺序等等,这里核心是属性绑定的问题,这些方法下面继续分析
  • 解决方法:内部框架使用的版本与boot和cloud版本一致,虽然改个版本号可以解决问题,但是的更重要的是问题的排查过程和对于spring容器初始化的理解不够。还有个遗留点,修改版本后不报错,那么低版本的初始化过程和高版本有什么区别呢,继续分析
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值