Spring 中的三种依赖注入方式
1.2.Field Injection
@Autowired注解使用的一大场景就是Field Injection
这种注入方式通过Java的反射机制实现,所以private的成员也可以被注入具体的对象
2.Constructor Injection
Constructor Injection是构造器注入,是我们日常最为推荐的一种使用方式
这种注入方式很直接,通过对象构建的时候建立关系,所以这种方式对象创建的顺序会有要求,当然Spring会为你设定先后顺序,除非你出现了循环依赖,然后就会抛出异常
3.Setter Injecction
Setter Injection也会用到@Autowried注解,但使用方式不同与Feild Injection,
Field Injection是用在成员变量上,而Setter Injection是使用在成员变量的Sette函数上
三种依赖注入方式对比
1.)可靠性:由于构造函数有严格的构建顺序和不可变性,一旦构建就可用,且不会被更改
2.) 可维护性:还是由于依赖关系的明确,从构造函数中可以分析出依赖关系,对于我们如何去读懂关系和维护关系更友好
3.)可测试性:当在复杂依赖关系的情况下考察程序是否更容易编写单元测试来评判,Constructor Injection 和Setter Injection的方式更容易mock和注入对象,所以更容易实现单元测试
4.)灵活性:主要根据开发实现时候的编码灵活性来判断,由于Constructor Injection对Bean的依赖关系设计有严格的顺序要求,所以这种注入 方式不太灵活。相反Field Injection和Setter Injection就非常灵活,但是也因为灵活带来了局面的混乱,是一把双刃剑
5.)循环关系的检测
对于Bean之间是否存在循环依赖关系的检测能力,只有Constructor Injection是自动检测的
6.)性能表现:主要影响的就是启动时间,由于Constructor Injection有严格的顺序要求,所以会拉长启动时间
结果一目了然,Constructor Injection在很多方面都是优于其他两种方式的,所以Constructor Injection 通常是首选方案
其他两者,如果要用@Autowried,推荐使用Setter Injection 的方式,这样IDEA也就不会有黄线,发出警告了。
总结:1.依赖注入的使用上,Constructor Injection是首选
2.@Autowired注解,使用Setter Injection方式,这样代码更容易编写单元测试
注:学习自公众号【程序猿DD】