文章目录
- 3.1 什么是注入
- 3.1.1 为什么需要注入
- 3.1.2 如何进行注入
- 3.1.3 注入好处
- 3.2 Spring 注入的原理分析(简易版)
- 3.3 Set 注入详解
- 3.3.1 JDK内置类型
- 3.3.2 自定义类型
- 3.3.2.1 第一种方式
- 3.3.2.2 第二种方式
- 3.4 构造注入
- 3.4.1 步骤
- 3.4.2 构造方法重载
- 3.5 注入总结
3.1 什么是注入
注入(Injection)是指通过依赖注入(DI)方式,由容器动态地将某些对象的依赖关系注入到这些对象中。在Spring框架中,最常见的是通过构造函数
、setter 方法
或字段
来进行依赖注入。
上面的文字太官方了,说的接地气点: 注入就是通过Spring⼯⼚及配置⽂件,为所创建对象的成员变量赋值.
3.1.1 为什么需要注入
通过编码的⽅式,为成员变量进⾏赋值,存在耦合,如下面这种方式:
stu.setId(1);
stu.setName("snow");
在 Spring 框架中,通过依赖注入,我们可以在配置文件或者通过注解的方式,明确地指定各个对象之间的依赖关系,然后由 Spring 容器来实现依赖的自动注入,从而简化了开发工作,提高了代码的可维护性和可扩展性。
3.1.2 如何进行注入
-
方式1:类的成员变量提供set get⽅法
-
方式2:配置spring的配置⽂件
<bean id="person" class="com.basic.Person"><property name="id"><value>10</value></property><property name="name"><value>露娜</value></property>
</bean>
3.1.3 注入好处
解耦合
依赖注入的优势在于,它使得对象的创建和依赖关系的管理不再由对象自身来完成,而是交由容器来完成。这样做的好处是降低了对象之间的耦合度,提高了代码的灵活性和可测试性,同时也使得代码更加清晰和易于维护。
在Spring框架中,通过依赖注入,我们可以在配置文件或者通过注解的方式,明确地指定各个对象之间的依赖关系,然后由Spring容器来实现依赖的自动注入,从而简化了开发工作,提高了代码的可维护性和可扩展性。
3.2 Spring 注入的原理分析(简易版)
Spring通过底层调⽤对象属性对应的 set ⽅法,完成成员变量的赋值,这种⽅式我们也称之为 set 注⼊ 。(这种方式底层是调用了对象的set方法,如果没有set方法是会报错的)
3.3 Set 注入详解
针对于不同类型的成员变量,在标签,需要嵌套其他标签
3.3.1 JDK内置类型
略…
3.3.2 自定义类型
3.3.2.1 第一种方式
- 为成员变量提供set get⽅法
- 配置⽂件中进⾏注⼊(赋值:将 userDAO 赋值给 UserServiceImpl)
<bean id="userService" class="xxxx.UserServiceImpl"><property name="userDAO"><bean class="xxx.UserDAOImpl"/></property>
</bean>
3.3.2.2 第二种方式
-
第一种方式存在的问题
- 配置⽂件代码冗余
- 被注⼊的对象(UserDAO),多次创建,浪费(JVM)内存资源
-
为成员变量提供set get⽅法
-
配置⽂件中进⾏配置
<bean id="userDAO" class="xxx.UserDAOImpl"/><bean id="userService" class="xxx.UserServiceImpl"><property name="userDAO"><ref bean="userDAO"/></property>
</bean>
3.4 构造注入
注⼊:通过Spring的配置⽂件,为成员变量赋值
Set注⼊:Spring调⽤Set⽅法 通过配置⽂件 为成员变量赋值
构造注⼊:Spring调⽤构造⽅法 通过配置⽂件 为成员变量赋值
3.4.1 步骤
-
提供有参构造⽅法
public class Customer implements Serializable {private String name;private int age;public Customer(String name, int age) {this.name = name;this.age = age;} }
-
Spring的配置⽂
<bean id="customer"class="com.snow.po.Customer"><constructor-arg><value>wang</value></constructor-arg><constructor-arg><value>20</value></constructor-arg>
</bean>
3.4.2 构造方法重载
- 参数个数不同
通过控制标签的数量进⾏区分
- 构造参数个数相同时
通过在标签引⼊ type属性 进⾏类型的区分
3.5 注入总结
依赖注入主要有以下几种类型:
构造函数注入:通过构造函数将依赖项注入到对象中。当创建对象时,容器会在构造对象时将依赖项作为参数传递给构造函数。
Setter 方法注入:通过调用对象的 Setter 方法来注入依赖项。在这种模式下,容器会通过调用对象的 Setter 方法来设置依赖项。
字段注入:通过直接设置对象的字段来注入依赖项。在这种模式下,容器会直接通过反射或其他方式将依赖项设置到对象的字段上。
依赖注入的优势在于,它使得对象的创建和依赖关系的管理不再由对象自身来完成,而是交由容器来完成。这样做的好处是降低了对象之间的耦合度,提高了代码的灵活性和可测试性,同时也使得代码更加清晰和易于维护。
实战中,应⽤set注⼊还是构造注⼊?
答案:set 注⼊更多
- 构造注⼊麻烦 (重载)
- Spring框架底层 ⼤量应⽤了 set注⼊