DI:Dependency Injection(依赖注入)
从字面上分析:
IoC:指将对象的创建权,反转给了Spring容器;
DI :指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。
IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
所谓的依赖注入,就是属性不创建对象,通过配置文件的配置将Spring容器里面的对象注入给对应的属性
依赖注入有三种方式
1.setter注入,(属性注入)
使用setter注入:
1,使用bean元素的子元素设置;
1,简单类型值,直接使用value赋值;
2,引用类型,使用ref赋值;
3,集合类型,直接使用对应的集合类型元素即可。
2,spring通过属性的setter方法注入值;
3,在配置文件中配置的值都是string,spring可以自动的完成类型的转换
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 员工 -->
<bean id="employee" class="cn.zj.spring.pojo.Employee" >
<!-- setter方法注入: 属性注入
<property name="" value="">
name : 属性名称
value : 基本数据类型+String类型的值注入
ref : 引用类型(对象类型)的注入
value 和ref 只能二选一
-->
<property name="age" value="18"></property>
<property name="name" value="jinken"></property>
<property name="dept" ref="dept"></property>
</bean>
<!-- 部门 -->
<bean id="dept" class="cn.zj.spring.pojo.Department" ></bean>
</beans>
2.构造器注入
<!--
1,默认情况下,constructor-arg的顺序就是构造器参数的顺序
2,3中调整构造器顺序:
1.index:在构造器中的参数索引(从0开始)
2.type:在构造器中的参数的类型
3.name:在构造器中按照构造器的参数名字设置值
====================
使用哪种注入方式比较好(setter?构造器?)?
1,如果一个类必须依赖另一个类才能正常运行,用构造器;
2,但是构造器的参数如果过多,构造器很难看;--测试参数不能少,否则报错20191221
3,更多的还是使用setter注入;
4,可以使用@Required标签来要求一个属性必须注入
-->
<!-- 员工 -->
<bean id="employee" class="cn.zj.spring.pojo.Employee" >
<!-- constructor注入 -->
<constructor-arg index="1" value="乔峰"/>
<constructor-arg index="0" value="19"/>
<constructor-arg ref="dept"/>
</bean>
<!-- 部门 -->
<bean id="dept" class="cn.zj.spring.pojo.Department" ></bean>
3.P命名空间
使用p命名空间注入先在约束上面引入 p标签(红色部分)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置部门 -->
<bean id="department" class="cn.zj.spring.pojo.Department"
p:id="123"
p:name="销售部"/>
<!-- 配置员工 -->
<bean id="emp" class="cn.zj.spring.pojo.Employee"
p:id="111"
p:name="西门吹雪"
p:dept-ref="department"/>
</beans>
4.集合类型值注入
在这里插入代码片
public class CollectionBean {
private Set<String> set;
private List<String> list;
private String[] array;
private Map<String, String> map;
private Properties prop; //读取本地 xxx.properties文件(本质就是一个Map集合)
}
<bean id="collectionBean" class="cn.gzxst.spring.pojo.CollectionBean">
<!-- set集合注入 -->
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
<!-- list集合注入 -->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
</list>
</property>
<!-- 数组注入 -->
<property name="array">
<array>
<value>AA</value>
<value>BB</value>
<value>CC</value>
</array>
</property>
<!-- map集合注入 -->
<property name="map">
<map>
<entry key="key1" value="乔峰"/>
<entry key="key2" value="虚竹"/>
<entry key="key3" value="段誉"/>
</map>
</property>
<!-- Properties注入 -->
<property name="prop">
<props>
<prop key="pro1">proVlaue1</prop>
<prop key="pro2">proVlaue2</prop>
<prop key="pro3">proVlaue3</prop>
</props>
</property>
</bean>