1、依赖注入 DI  dependency injection

     依赖:指 bean 对象创建依赖于容器,Bean 对象的依赖资源

     注入:指 bean 对象依赖 的资源由容器来设置和装配.

 

2、spring注入——构造器注入 3种,名字|序号|类型

      ioc创建对象

造器注入需要Bean有相应的构造器。构造器注入类似下面这样,定义一个bean节点,id属性指明该Bean的唯一标识符,class属性指定Bean对应的类名。

然后在Bean节点中指明构造器的参数类型和值。对于基本类型和字符串等类型,直接将值写在双引号中即可。

<bean id="maleStudent" class="yitian.learn.ioc.Student">
    <constructor-arg type="int" value="18"/>
    <constructor-arg type="java.lang.String" value="一个男生"/>
</bean>

 

按照构造器参数类型来进行的依赖注入,如果构造器有相同的类型,上面的注入就无法进行了。这时候可以按照参数的索引来进行注入。

<bean id="femaleStudent" class="yitian.learn.ioc.Student">
    <constructor-arg index="0" value="一个女生"/>
    <constructor-arg index="1" value="16"/>
</bean>

 

 

3.spring注入——setter注入

  要求被注入的属性必须有set方法,Set方法的方法名由set属性首字母大写。

  如果属性是boolean,没有get方法是is。

 和构造器注入类似,只不过Bean里面使用property节点指定属性和值。

(1)、常量注入

<bean id="anotherMaleStudent" class="yitian.learn.ioc.Student">
    <property name="name" value="另一个男生"/>
    <property name="age" value="15"/>
</bean>

(2)、bean注入

也可以在Bean中注入其他Bean,只需要使用ref属性指向已定义的一个Bean的id。

<bean id="mathClassroom" class="yitian.learn.ioc.Classroom">
    <property name="teacher" ref="mathTeacer"/>
    <property name="students" ref="someStudents"/>
</bean>

(3)、数组注入

(4)、List注入

  (5)、map注入

  (6)、Set注入

private String [] empName;//数组
	private List<Employee> empList;//list集合
	private Set<Employee> empsets;//set集合
	private Map<String,Employee> empMaps;//map集合
	private Properties pp;//Properties的使用
<!-- 给数组注入值 -->
<property name="empName">
	<list>
		<value>小明</value>
		<value>小明小明</value>
		<value>小明小明小明小明</value>
	</list>
</property>
 
<!-- 给list注入值 list 中可以有相当的对象 -->
<property name="empList">
	<list>
		<ref bean="emp2" />
		<ref bean="emp1"/>
		<ref bean="emp1"/>
		<ref bean="emp1"/>
		<ref bean="emp1"/>
		<ref bean="emp1"/>
		<ref bean="emp1"/>
	</list>
</property>
 
<!-- 给set注入值 set不能有相同的对象 -->
<property name="empsets">
	<set>
		<ref bean="emp1" />
		<ref bean="emp2"/>
		<ref bean="emp2"/>
		<ref bean="emp2"/>
		<ref bean="emp2"/>
	</set>
</property>
 
<!-- 给map注入值 map只有key不一样,就可以装配value -->
<property name="empMaps">
	<map>
		<entry key="11" value-ref="emp1" /> 
		<entry key="22" value-ref="emp2"/>
		<entry key="22" value-ref="emp1"/>
	</map>
</property>
 
<!-- 给属性集合配置 -->
<property name="pp">
	<props>
		<prop key="pp1">abcd</prop>
		<prop key="pp2">hello</prop>
	</props>
</property>
</bean>
 
<bean id="emp1" class="com.hsp.collection.Employee">
	<property name="name" value="北京"/>
	<property name="id" value="1"/>
</bean>
<bean id="emp2" class="com.hsp.collection.Employee">
	<property name="name" value="天津"/>
	<property name="id" value="2"/>
</bean>

(7)、NULL注入

如果我们需要一个空引用,XML可以写为如下这样:

<bean class="ExampleBean">
    <property name="email">
        <null/>
    </property>
</bean>

 (8)、Properties注入

  (9)、P命名空间注入

对于每一个属性都要编写一个property节点,稍嫌麻烦。Spring因此提供了p命名空间用来简化属性注入的编写。要使用p命名空间,需要在根节点beans上添加一行属性声明:xmlns:p="http://www.springframework.org/schema/p"

使用p命名空间,Bean定义会简化不少。不过p命名空间也有缺点,p命名空间的类型需要在运行时动态读取,性能相比于上面的传统属性注入有所降低。所以如果对于性能要求很高,还是使用传统property节点最好。

<bean id="anotherFemaleStudent" class="yitian.learn.ioc.Student"
      p:name="另一个女生"
      p:age="16"/>

  (10)、C 命名空间注入,需要在头文件中加入xmlns:c="http://www.springframework.org/schema/c"

<bean id="englishTeacher" class="yitian.learn.ioc.Teacher"
      c:name="英语老师"
      c:age="32"/>