一、IOC和DI
1、什么是IOC?
IOC(inversion of controll),控制反转。把对象之间的关系由容器来建立。
2、什么是DI?
DI(pendency injection) 容器通过调用set方法或者构造器来建立对象之间的依赖关系。
注:IOC是目标,DI是手段。
3、通过set方法注入
步骤一:添加相应的set方法。
public class A {
private IB b;
public void setB(IB b) {
System.out.println("setB()" + b);
this.b = b;
}
步骤二:在配置文件中,使用property元素进行配置
<!-- 配置set方法注入 -->
<!--
property:表示采用set方法注入,其中,
name指定方法名(会将首字母大写,然后在前面
添加set形成方法名,比如,这儿会调用setB方法)。
-->
<bean id="b1" class="ioc.B"/>
<bean id="c1" class="ioc.C"/>
<bean id="a1" class="ioc.A">
<property name="b" ref="c1"/>
</bean>
执行过程如下:
4、构造器注入
步骤一:添加相应的构造器
public class Phone {
private Cpu cpu;
public Phone(Cpu cpu) {
System.out.println("Phone(Cpu) " + cpu);
this.cpu = cpu;
}
步骤二:在配置文件中,使用constructor-arg元素进行配置
<!-- 配置构造器注入 -->
<!--
constructor-arg:表示采用构造器注入,
其中index指定被注入的参数的下标。
-->
<bean id="cpu" class="ioc.Cpu"/>
<bean id="phone" class="ioc.Phone">
<constructor-arg index="0" ref="cpu"/>
</bean>
5、自动装配(了解)
1)在配置文件当中,不用明确告诉容器采用哪种注入方式,也不用告诉
容器被注入的bean的id,由容器依据某些规则,自动建立对象之间的依赖
关系。
注:
a.容器仍然需要调用set方法或者构造器。
b.容器默认情况下,不会自动装配。
2)只需要配置autowire属性:
<bean id="cp1" class="autowire.Computer"/>
<bean id="cp2" class="autowire.Computer"/>
<!--
autowire:表示自动装配。
byName:容器以属性名作为bean的id,查找是否有
对应的bean存在,如果存在,就调用对应的set方法,
如果不存在,不注入(不调用任何方法)。
byType:容器以属性类型作为bean的类型,查找是否有
对应的bean存在,如果存在,就调用对应的set方法,
如果不存在,不注入。
注:有可能找到多个,则出错。
constructor:类似于byType,只不过调用的是构造器。
-->
<bean id="stu" class="autowire.Student"
autowire="byType"/>
注:
a.自动装配要少用。(配置文件虽然简化了,但可读性变差,
另外,容易出错)
b.如果要使用自动装配,尽量使用byName。
6、注入基本类型的值
使用value属性来注入。
创建Teacher类
public class Teacher {
private String name;
private int age;
private List<String> interest;
private Set<String> city;
private Map<String,Double> score;
private Properties db;
创建Student2类
public class Student2 {
private String name;
private String interest;
private double score;
private int pageSize;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<bean id="stu1" class="value.Student2">
<property name="name"
value="#{t1.name}"/>
<property name="interest"
value="#{t1.interest[1]}"/>
<property name="score"
value="#{t1.score['英语']}"/>
<property name="pageSize"
value="#{config.pagesize}"/>
</bean>
<!-- 读取properties文件的内容 -->
<!--
location:指定要读取的文件的位置。
注:
a. classpath: 依据类路径去查找文件。
b. 容器读取properties文件的内容,并将
这些内容存放到Properties对象里面。
-->
<util:properties id="config"
location="classpath:config.properties"/>
<!-- 将集合类型的值配置成一个bean -->
<util:list id="interestBean">
<value>抽烟</value>
<value>喝酒</value>
<value>烫头</value>
</util:list>
<util:set id="cityBean">
<value>金陵</value>
<value>洛阳</value>
<value>长安</value>
</util:set>
<util:map id="scoreBean">
<entry key="english" value="90"/>
<entry key="math" value="80"/>
</util:map>
<util:properties id="dbBean">
<prop key="username">Tom</prop>
<prop key="password">1234</prop>
</util:properties>
<!-- 以引用的方式注入集合类型的值 -->
<bean id="t2" class="value.Teacher">
<property name="interest"
ref="interestBean"/>
<property name="city"
ref="cityBean"/>
<property name="score"
ref="scoreBean"/>
<property name="db"
ref="dbBean"/>
</bean>
<!--
value:用来注入基本类型的值。
-->
<bean id="t1" class="value.Teacher">
<property name="name" value="小马哥"/>
<property name="age" value="50"/>
<property name="interest">
<list>
<value>钓鱼</value>
<value>做饭</value>
<value>看电视</value>
<value>看电视</value>
</list>
</property>
<property name="city">
<set>
<value>杭州</value>
<value>北京</value>
<value>成都</value>
</set>
</property>
<property name="score">
<map>
<entry key="英语" value="60"/>
<entry key="math" value="80"/>
</map>
</property>
<property name="db">
<props>
<prop key="username">Sally</prop>
<prop key="password">1234</prop>
</props>
</property>
</bean>
</beans>