美文网首页
属性注入

属性注入

作者: 抬头挺胸才算活着 | 来源:发表于2021-11-03 22:35 被阅读0次

    参考资料:
    https://stackoverflow.com/questions/39890849/what-exactly-is-field-injection-and-how-to-avoid-it

    • 注入方式
      1、构造器
      2、setter或者其他方法
      3、反射

    • 注入方式选择
      1、构造器:强制/不可变依赖
      2、setter:可选/可变依赖
      3、反射注入:尽量避免

    • 注入缺点
      1、不能像构造函数注入一样创建不可变对象
      2、类跟DI容器紧耦合,脱离了DI容器就不能正常运行
      3、单元测试的时候不能单独创建对象(除非用反射),需要使用DI容器,这样就有点像集成测试(多个组件组合测试)了
      4、类的依赖不容易在接口上反应出来,而是通过构造器和方法。
      5、很容易造成有很多依赖,太多的依赖容易违反单一类职责

    • 使用构造器注入的好处
      1、保证依赖不可变
      对象可以定义为final
      2、保证依赖不为空
      不用担心程序启动正常,但是使用过程中因注入对象为空而导致的异常。无法注入时会在启动阶段就直接暴露。
      3、循环依赖??
      很多说法是通过构造器注入的方式能够避免循环依赖,但是我对这种说法不甚赞同。循环依赖并不是缺陷,而是一种特殊的依赖形式,所以“避免循环依赖”在我看来并不能被称为是优点。
      Spring通过三级缓存的方式直接在让用户无感的前提下,解决了setter注入以及filed注入方式下的循环依赖,但是并没有直接处理构造器注入这种方式,我们可以通过@Lazy注解让构造器方式兼容循环依赖。
      3、提升了代码的可复用性
      非IOC容器环境可使用new实例化该类的对象

    • 总结
      属性注入虽然很容易写,但是有很多缺点,因此尽量用构造器注入和少量的setter注入

    相关文章

      网友评论

          本文标题:属性注入

          本文链接:https://www.haomeiwen.com/subject/xdxhzltx.html