## IOC/DI
DI 的优势:解耦
紧耦合:软件组件之间是紧密依赖,很难拆分
松耦合:软件组件之间是松散依赖,随时可以更换
解耦:将软件组件从紧耦合转换为松耦合关系。
### IOC、DI
利用Spring 管理光头强和工具之间的依赖关系
1. 创建工具接口
/**
* 工具接口
*/
public interface Tool {
}
2. 创建具体的工具 斧子
public class Axe implements Tool, Serializable {
@Override
public String toString() {
return "斧子";
}
}
3. 创建锯
public class Saw implements Tool, Serializable{
@Override
public String toString() {
return "电锯";
}
}
4. 创建工人类型
public class Worker implements Serializable {
private String name; //基本值
private Tool tool; //Bean 对象
private int age; //基本值,
public Worker() {
name = "光头强";
}
public Worker(String name) {
super();
this.name = name;
}
public void setTool(Tool tool) {
this.tool = tool;
System.out.println("setTool:"+tool);
}
public Tool getTool() {
return tool;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println("setName:"+name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
System.out.println("setAge:"+age);
}
public void work() { //测试方法
System.out.println(name+"使用"+tool+"砍树");
}
@Override
public String toString() {
return "Worker [name=" + name + ", tool=" + tool + "]";
}
}
5. 在Spring配置文件中利用 IOC/DI 解决依赖关系
<!-- 控制反转 IOC:由Spring创建对象称为控制反转 -->
<bean id="axe" class="day02.Axe"/>
<bean id="saw" class="day02.Saw"/>
<bean id="qiang" class="day02.Worker">
<!-- 依赖注入DI:由Spring帮助建立对象的依赖关系 -->
<!-- spring会自动调用 setTool 方法注入 axe 引用 -->
<property name="tool" ref="saw"/>
</bean>
6. 测试
public class TestCase {
ClassPathXmlApplicationContext ctx;
@Before
public void init() {
ctx=new ClassPathXmlApplicationContext(
"applicationContext.xml");
}
@After
public void destroy() {
ctx.close();
}
@Test
public void testQiang() {
Worker qiang = ctx.getBean("qiang",Worker.class);
qiang.work();
}
}
### 构造器参数注入
Spring支持 利用 构造器创建对象:constructor-arg 子元素,其中index="0"用于指定参数在构造器参数的位置。
1. 配置
<bean id="xiong" class="day02.Worker" lazy-init="true">
<!-- 构造器参数注入,也就是调用有参数
构造器创建对象 -->
<constructor-arg index="0" value="熊大"/>
<property name="tool" ref="saw"/>
</bean>
2. 测试
@Test
public void testXiong() {
Worker xiong = ctx.getBean("xiong",Worker.class);
xiong.work();
}
### 按照名字自动注入
Spring支持自动按照名字注入功能,Spring会自动检查Bean属性和Bean ID的匹配,如果匹配上就自动完成注入
优点:自动注入可以减少XML文件的编写量。
1. 编写配置文件