目录

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即可完成依赖注入。 

mapstruct注入到容器 setter注入的优点_mapstruct注入到容器

1.1、优点

简单方便,属性注入的方式非常简单,我们只需要在需要注入的变量上面加上@Autowired注释即可完成属性注入

1.2、缺点

mapstruct注入到容器 setter注入的优点_开发语言_02

属性注入是spring框架不推荐,而且idea也会给我们一样的提示,不推荐我们使用属性注入的方式完成依赖注入。

主要缺点如下:

1、无法完成final的变量注入。

2、只适用于IOC容器

3、容易违背单一性原则

缺点分析:

1、无法完成不可变对象的注入

这个不难理解,我们final修饰的变量只能初始化赋值,或者在构造方法中赋值。

2、只适用于IOC容器

属性注入的泛用性比较差,只适用于IOC容器,如果我们后期维护的过程中更换了容器,属性注入的方法就不可用了。

3、容易违背单一职责原则

因为属性输入的方式非常容易,我们就很容易的在开发中在这一个类中注入多个对象。这就使我们很容易违反设置模式中的单一职责原则,注意不是一定违背单一职责设计原则,而是一种可能性。

2、setter方法注入

mapstruct注入到容器 setter注入的优点_spring_03

我们可以看到,setter注入就要比属性注入麻烦。

2.1、优点:

完全符合单一职责设计原则,一个setter方法只能针对一个对象进行依赖注入。

2.2、缺点:

1、还是无法解决不可变对象的注入问题

2、被注入的对象容易被改变

缺点分析:

1、不可变对象的注入问题

同样的,与属性注入类似我们依然不能通过setter方法去解决不可变对象(final修饰)的依赖注入问题。

2、被注入的对象容易被改变

因为是通过setter方法注入,所以说我们可以通过类外调用setter方法,造成被注入的对象被修改。


 3、构造方法注入

构造方法注入是在Spring4版本之后官方推荐的注入方法。

mapstruct注入到容器 setter注入的优点_java_04

3.1、优点:

1、可以注入不可变对象

2、对象不可被修改

3、通用性更好

优点分析:

1、可以注入不可变对象

因为构造方法注入是在构造方法中进行的,而且final修饰的变量在构造方法中可以被赋值,所以说,构造方法注入的方式是可以解决不可变对象依赖注入的问题。

2、对象不可被修改

构造方法注入不会像 Setter 注入那样,构造方法在对象创建时只会执行一次,因此它不存在注入对象被随时(调用)修改的情况。

3、通用性好

构造方法和属性注入不同,构造方法注入可适用于任何环境,无论是 IoC 框架还是非 IoC 框架,构造方法注入的代码都是通用的,所以它的通用性更好。