关于spring依赖注入的坑

  • • 发表于 6年前
  • • 作者 大妖怪
  • • 5216 人浏览
  • • 6 条评论
  • • 最后编辑时间 6年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

昨天遇到这么一个有意思的事情。首先场景是这样的,我在集成短信功能,想到可能市面上有很多第三方的短信功能,为了方便以后更换,所以用了抽象工厂模式来做这块的功能。

项目是用springboot2.1搭建的,功能模块的结构大概是这样:

  • AbsSmsFactory:抽象工厂
  • SmsUtil:抽象工具接口
  • NetEasySmsFactory: 网易云短信工厂,实现抽象工厂
  • NetEasySmsUtil:网易云短信工具,实现抽象工具接口,并且发送短信和校验验证码都是在这实现的
  • SmsProperty:获取配置的,里面的内容主要是读取配置文件然后动态加载短信工厂类
  • SmsUtilCreater:这个类是最后直接注入到项目获取短信工具的
    配置文件主要写了全类名让获取配置文件根据类名加载

    模块大概就是这么一个结构,但是在获取具体工具实例的时候遇到这么一个坑,
    本来想偷懒,直接用spring的依赖注入把具体工具拿到,于是最开始在具体短信工具这样写:

    在网易云的短信工厂这样写:

    本来想得美美的,一运行发现报了个空指针,debug一看发现这玩意是null

    明显没注入进来。
    然后,想了下,原因是这样:

    我在获取网易云工厂实例的时候用了反射来获取,相当于new出来的实例,所以这里不能用spring的注解来注入了。但是我又不想用静态类,又想获取一个单例,最后只好用了单例模式的懒汉模式,网易云短信工具里这样改:

    网易云短信工厂里这样改:

    这样就好了。
    如果再要加其它商家的短信接口,直接增加一个包,加一个工厂继承抽象工厂,加一个实例继承抽象工具,然后在配置里面替换成新增工厂的全类名就ok,调用的代码里不需要任何改动。
分享到:
6条评论
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回复:200 积分:7517

已加入社区[2943]天

梦里巷口,可有你倚门回首

作者详情》
Top