目录
0、有几种注入方式
1、属性注入
1.1、优点
1.2、缺点
缺点分析:
1、无法完成不可变对象的注入
2、只适用于IOC容器
3、容易违背单一职责原则
2、setter方法注入
2.1、优点:
2.2、缺点:
缺点分析:
1、不可变对象的注入问题
2、被注入的对象容易被改变
3、构造方法注入
3.1、优点:
优点分析:
1、可以注入不可变对象
2、对象不可被修改
3、通用性好
前面我们说过学习Spring最重要的两个概念就是IOC和DI,IOC是控制反转,控制反转是一种思想,而DI(依赖注入)是控制反转的一种具体实现方式。我们有几种能够实现依赖注入的方式,这些方式有有什么优缺点。
0、有几种注入方式
1、属性注入
2、setter方法注入
3、构造方法注入
我们具体说明其优缺点
1、属性注入
属性注入是最简单,用的最多的一种注入方式,我们只需要在需要注入对象的成员变量上面加上注释@Autowired即可完成依赖注入。
1.1、优点
简单方便,属性注入的方式非常简单,我们只需要在需要注入的变量上面加上@Autowired注释即可完成属性注入
1.2、缺点
属性注入是spring框架不推荐,而且idea也会给我们一样的提示,不推荐我们使用属性注入的方式完成依赖注入。
主要缺点如下:
1、无法完成final的变量注入。
2、只适用于IOC容器
3、容易违背单一性原则
缺点分析:
1、无法完成不可变对象的注入
这个不难理解,我们final修饰的变量只能初始化赋值,或者在构造方法中赋值。
2、只适用于IOC容器
属性注入的泛用性比较差,只适用于IOC容器,如果我们后期维护的过程中更换了容器,属性注入的方法就不可用了。
3、容易违背单一职责原则
因为属性输入的方式非常容易,我们就很容易的在开发中在这一个类中注入多个对象。这就使我们很容易违反设置模式中的单一职责原则,注意不是一定违背单一职责设计原则,而是一种可能性。
2、setter方法注入
我们可以看到,setter注入就要比属性注入麻烦。
2.1、优点:
完全符合单一职责设计原则,一个setter方法只能针对一个对象进行依赖注入。
2.2、缺点:
1、还是无法解决不可变对象的注入问题
2、被注入的对象容易被改变
缺点分析:
1、不可变对象的注入问题
同样的,与属性注入类似我们依然不能通过setter方法去解决不可变对象(final修饰)的依赖注入问题。
2、被注入的对象容易被改变
因为是通过setter方法注入,所以说我们可以通过类外调用setter方法,造成被注入的对象被修改。
3、构造方法注入
构造方法注入是在Spring4版本之后官方推荐的注入方法。
3.1、优点:
1、可以注入不可变对象
2、对象不可被修改
3、通用性更好
优点分析:
1、可以注入不可变对象
因为构造方法注入是在构造方法中进行的,而且final修饰的变量在构造方法中可以被赋值,所以说,构造方法注入的方式是可以解决不可变对象依赖注入的问题。
2、对象不可被修改
构造方法注入不会像 Setter 注入那样,构造方法在对象创建时只会执行一次,因此它不存在注入对象被随时(调用)修改的情况。
3、通用性好
构造方法和属性注入不同,构造方法注入可适用于任何环境,无论是 IoC 框架还是非 IoC 框架,构造方法注入的代码都是通用的,所以它的通用性更好。