解决使用@Autowired导入静态对象的实例时出现为null的情况



  好久没写csdn博客了,今年4月份刚换了一份工作,所以从那时到现在一直特别忙,总是挤不出时间出来写博客,今天我觉得不能再拖了,一定也要挤出时间出来每周至少要写3个博客!我觉得技术需要不断分享体现出它的价值,作为一个技术人,更不用说了!

  好!废话不多说!开始步入正题!最近在写增删改查的业务代码时遇到了一个有点烦的问题,表面上看起来好像不难的样子,但是解决起来也不是很简单。这个问题就是我在写工具类时,因为工具类的method一般都是用static来修饰的,所以相关的对象或字段也需要用static来修饰,但当我理所当然地对一个静态对象使用@AutoWired自动导入它的实例时,悲剧还是发生了!大家可以看如下图:

在这里插入图片描述
  懂java的人一眼就可以看出这个mapper类肯定在这个类中做各种CUID的骚操作,但是真能得逞吗?当我使用riskCptBasicInfoMapper这个对象进行一个insert操作时还是报了一个nullpointer(空指针)的异常,乍一看原来是riskCptBasicInfoMapper这个对象为null了!!看来@Autowired这个注解是无效的!于是实在想不出解决方案的我直接在stackoverflow网站上请求大神帮助,没想到一搜还真给我提供了一个非常好的思路!如下图所示:

在这里插入图片描述
  学过spring的同学都会知道我们可以用setter的方式来将对象的实例赋予给对象,于是我们可以使用@PostConstruct注解赋予静态对象dao一个实例,从而真正实例化静态对象dao。同时在用这个方法解决这个问题时需要注意如下两点:

  1. 这个类必须使用@component这个注解,代表这个类以组件的形式注册到spring容器中,从而能够被容器管理;
  2. 在通过setter方式可以实例化静态对象时,另一个赋值的对象dao0需要加上@Autowired注解。

所以根据stackoverflow的解决问题的思路,我们应当改成如下图所示的代码:


  所以至此这个问题便轻轻松松地解决了!stackoverflow对这个问题的描述还是挺不错的,我把相关网址都贴出来,大家也可以看下!

Can you use @Autowired with static fields?
@autowired in static classes

  建议大家在平常编程时如果遇到自己一时解决不了问题时,建议学会在Google上使用英文关键字来搜索,这比起一直用百度搜索真得可以节省很多时间!同理,在自己自学一个新的知识点时,可以直接去相关官网阅读相关技术文档!英语不好没事!遇到不懂的单词,那就一个一个翻译,相信我!读个习惯!你就找到阅读的那种feel了!加油!晚安!

发布了17 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Melo_FengZhi/article/details/100905109