Spring的主要特性之一是控制反转(IOC).
IOC(控制反转:Inverse of Control ),又称作依赖注入,是一种重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring 框架的核心。
通过实例了解下:
1.新建工程Spring402;
2.这里一主管完成测试工作为例,新建一个类ZhangSan,张三能够完成测试工作:
package com.test.service;
public class ZhangSan {
public void test(){
System.out.println("张三--测试程序");
}
}
3.新建一个类JavaWork,完成测试工作:
package com.test.service;
public class JavaWork {
public void doTest(){
ZhangSan zhangsan = new ZhangSan();
zhangsan.test();
}
}
这里指定了张三来完成测试工作。
4.新建测试类:主管完成测试任务:
package com.test.test;
import com.test.service.JavaWork;
public class Test {
public static void main(String[] args) {
JavaWork javaWork = new JavaWork();
javaWork.doTest();
}
}
在这里主管新建一个完成测试任务对象,调用对象的doTest方法完成测试工作。
分析这个实例可以发现,JavaWork类与ZhangSan这个类是完全耦合在一起的。这时如果有一个新的测试员Lisi类:
package com.test.service;
public class LiSi {
public void test(){
System.out.println("李四--测试程序");
}
}
这时如果让李四来完成测试工作,而不是让张三,那么要修改的地方就比较多了,这样会破坏程序的完整性。这时就有一种设计思路IOC,让完成工作这个类把控制权转交出来,让主管能够指定由谁去完成测试工作。
1.定义接口:测试员
package com.test.service;
public interface Tester {
public void test();
}
2.修改ZhangSan类:
package com.test.service;
public class ZhangSan implements Tester{
public void test(){
System.out.println("张三--测试程序");
}
}
3.修改LiSi类:
package com.test.service;
public class LiSi implements Tester{
public void test(){
System.out.println("李四--测试程序");
}
}
4.修改完成工作类:
package com.test.service;
public class JavaWork {
private Tester tester;
public void setTester(Tester tester) {
this.tester = tester;
}
public void doTest(){
tester.test();
}
}
这里是只管有个人来做测试,而不管这个人是谁。
5.修改测试函数:
package com.test.test;
import com.test.service.JavaWork;
import com.test.service.ZhangSan;
public class Test {
public static void main(String[] args) {
JavaWork javaWork = new JavaWork();
javaWork.setTester(new ZhangSan());
javaWork.doTest();
}
}
这里主管可以指定有谁来完成任务了。让李四完成的时候,只需在JavaWork对象中传入LiSi类的对象即可。
现在引入Spring来完成上面的功能。Spring能够管理bean,写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="zhangsan" class="com.test.service.ZhangSan"></bean>
<bean id="lisi" class="com.test.service.LiSi"></bean>
<bean id="javawork" class="com.test.service.JavaWork">
<property name="tester" ref="lisi"></property>
</bean>
</beans>
这里分别定义了类ZhangSan、LiSi、JavaWork类的实例,定义JavaWork类的实例时使用<property>标签给这个类中的属性tester赋值,使用ref标签给属性赋值。当使用ref属性时,JavaWork类中会自动执行tester的set函数来给这个属性赋值。
6.定义新的测试函数:
package com.test.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.test.service.JavaWork;
public class Test2 {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
JavaWork javaWork = (JavaWork) ac.getBean("javawork");
javaWork.doTest();
}
}
这样使用Spring后,当需要更换测试人员时只需修改配置文件即可。