SpringDI的注入方式
-
- 1.DI简介
- 2.DI注入的方式
-
- 1.使用有参构造器方式进行注入
- 2.使用set方法进行注入
- 3.自动注入
- 3.DI其他类型值的注入
-
- 1.array
- 2.list
- 3.set
- 4.map
- 5.Properties
为什么使用DI(依赖注入):
- 作用:给创建好的对象中的全局的属性或者对象进行赋值的操作
1.DI简介
- 英文全称(Dependency Injection)
- 中文名称:依赖注入
依赖:一个类在另一个类中作为全局属性时
注入:通过外部给自己属性(或其他内容)进行 - 类与类之间的关系:
1、 继承(官方名称:泛化);
2、 实现;
3、 依赖:类和类之间的关系是偶然的,临时的.在代码层面另一个类当作这个类的方法参数或局部变量;
4、 关联:类与类之间存在一定联系,可以是单向联系可以是双向联系.例如:学生和老师.(平时理解关联是一种强依赖),体现在代码层面,另一个类是这个类的全局属性;
5、 聚合:类与类之间是可以单独存在的.但是有存在整体和部分的关系.例如:机箱和CPU.体现在代码层面:另一个类是这个类的全局属性;
6、 组合:类与类之间是整体和部分之间的部分,不可分.例如人和心脏.体现在代码层面:另一个类是这个类的全局属性;
7、 关系强度:组合>聚合>关联>依赖; - DI的意义
解除类与类之间高耦合性,给对象中全局对象赋值的操作 - 为什么称DI和IoC是同一个事情
Spring帮助创建对象的过程叫做IoC,创建对象时给对象中全局对象赋值叫做DI,所以认为IoC和DI是同一个事情
2.DI注入的方式
1.使用有参构造器方式进行注入
<bean id="cla" class="com.spring4.Clazz">
<constructor-arg name="cname" value="高一(某)班"></constructor-arg
<constructor-arg name="clazzno" value="507"></constructor-arg>
</bean>
package com.bjsxt.spring4;
public class Clazz {
private int clazzno;
private String cname;
public Clazz(int clazzno, String cname) {
this.clazzno = clazzno;
this.cname = cname;
}
public Clazz() {
}
public int getClazzno() {
return clazzno;
}
public void setClazzno(int clazzno) {
this.clazzno = clazzno;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Clazz{" +
"clazzno=" + clazzno +
", cname='" + cname + '\'' +
'}';
}
}
2.使用set方法进行注入
<!--
name:对象的属性名
value和ref的使用场景
value: 如果注入的属性类型是基本数据类型(包含String)使用value
ref:如果注入的属性类型是对象这个时候使用ref
-->
<bean id="stu" class="com.spring4.Student">
<property name="name" value="lisi"></property>
<property name="sex" value="男"></property>
<property name="age" value="20"></property>
<property name="clazz" ref="DQCGM"></property>
</bean>
package com.spring4;
public class Student {
private String name;
private String sex;
private int age;
private Clazz clazz;
public Student(Clazz clazz) {
System.out.println("--调用了有参构造---");
this.clazz = clazz;
}
public Student(String name, String sex, int age, Clazz clazz) {
this.name = name;
this.sex = sex;
this.age = age;
this.clazz = clazz;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", clazz=" + clazz +
'}';
}
}
3.自动注入
<!--
底层走的是set方法
byName:这个时候就会在当前的xml中寻找【bean的ID名称】和需要注入实体中的【属性名】一致,进行匹配注入
byType:这个时候就会在当前的xml中寻找【bean标签的类型】和需要注入实体中的【属性的类型】一致,进行匹配注入
底层走的是构造器
constructor:这个时候首先会根据[有参构造器的形参名]名称进行查找,如果名称没有一致的,在根据类型[有参构造器的类型]进行查找
需要注意:*在指定的类中必须提供合适的有参构造器才可以
-->
<bean id="stu" class="com.spring4.Student" autowire="constructor"></bean>
3.DI其他类型值的注入
1.array
<bean id="us" class="com.spring4.User">
<property name="arr">
<array>
<value>A</value>
<value>B</value>
<value>C</value>
</array>
</property>
</bean>
2.list
<bean id="us" class="com.spring4.User">
<property name="li">
<list>
<value>A</value>
<value>B</value>
<value>C</value>
</list>
</property>
</bean>
3.set
<bean id="us" class="com.spring4.User">
<property name="se">
<set>
<value>A</value>
<value>A</value>
<value>B</value>
<value>C</value>
</set>
</property>
</bean>
4.map
<bean id="us" class="com.spring4.User">
<property name="map">
<map>
<entry>
<key>
<value>A</value>
</key>
<value>1</value>
</entry>
<entry>
<key>
<value>B</value>
</key>
<value>1</value>
</entry>
<entry>
<key>
<value>C</value>
</key>
<value>1</value>
</entry>
</map>
</property>
</bean>
5.Properties
<bean id="us" class="com.spring4.User">
<property name="pro">
<props>
<prop key="key">value</prop>
</props>
</property>
</bean>