属性注入
2021-11-03 本文已影响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注入