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"/>