Spring-DI依赖注入的三种方式

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>

你可能感兴趣的:(Spring)