ioc简单介绍
ioc(控制反转:Inverse of control),又叫做 依赖注入,是一种重要的面向对象编程法则来削减计算机程序的耦合问题,也是轻量型Spring框架的的核心
控制反转的简单理解
这是我自己的简单理解:简单来讲就是控制权的转移,从而减少代码程序之间的耦合程度,所谓耦合,就是相互关联的程度
举个栗子:主管找人测试程序,在这样的关系下,是主管(调用者)每次都主动找人(另外一个类)测试程序,假如张三会测试程序(张三类种有测试程序的方法),那么就是主管调用张三.测试方法,是主管控制了张三。这里面就存在张三与主管之间耦合性,假如李四也会测试程序,而主管想这次让李四来测试程序,那么就要重新new一个李四。而在spring中,它把找人测试程序放到一个容器(在spring中叫做IOC容器)里,当你需要找人测试程序时,就对容器发出请求,然后目标(有人测试程序)就会注入给你。相对于上面的过程,主管不再是控制者了,反而是一名请求者(虽然本身还是一名调用者),依赖于容器给予你资源,控制权落在了容器身上。
spring控制反转的简单实例
新建JavaProject,新建如下的几个类:
JavaWork:负责找人测试程序
package com.java.service;
public class JavaWork {
/**
* 找人测试程序
*/
public static void doTest() {
ZhangSan zs = new ZhangSan();
zs.test();
}
}
张三类:有测试程序的方法;
package com.java.service;
public class ZhangSan implements Tester{
public void test() {
System.out.println("张三---做测试");
}
}
测试类:主管下达命令
package com.java.test;
import com.java.service.JavaWork;
public class Test {
/**
* 主管下达命令-找人测试程序
* @param args
*/
public static void main(String[] args) {
JavaWork javaWork = new JavaWork();
JavaWork.doTest();
}
}
以上测试肯定没问题,那么现在问题来了:如果李四也会测试程序,而恰恰主管想让李四来测试,如果是不是要修改上面的程序,在Javawork中要重新new 一个李四,显得是不是很麻烦,我们只是想换个人啊,而现在我们可以建一个测试程序的接口:
package com.java.service;
public interface Tester {
public void test();
}
每一个人都继承tester接口,实现里面的test方法就行。例如:
package com.java.service;
public class Lisi implements Tester{
public void test() {
System.out.println("李四---做测试");
}
}
javaWork:
package com.java.service;
public class JavaWork {
/**
* 找人测试程序
*/
private static Tester tester;
public void setTester(Tester tester) {
this.tester = tester;
}
public static void doTest() {
/*ZhangSan zs = new ZhangSan();
zs.test(); */
tester.test();
}
}
测试类:
package com.java.test;
import com.java.service.JavaWork;
import com.java.service.Lisi;
import com.java.service.Tester;
public class Test {
/**
* 主管下达命令-找人测试程序
* @param args
*/
public static void main(String[] args) {
JavaWork javaWork = new JavaWork();
javaWork.setTester(new Lisi());
JavaWork.doTest();
}
}
上面的程序很好的解决了代码耦合的问题,但还是要修改代码,Spring的出现就解决了这一问题,通过修改配置文件beans.xml实现依赖注入 。具体xml代码如下:
<?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.java.service.ZhangSan"></bean>
<bean id="lisi" class="com.java.service.Lisi"></bean>
<bean id="javawork" class="com.java.service.JavaWork">
<property name="tester" ref="lisi"></property>
</bean>
</beans>
测试:
package com.java.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.java.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();
}
}
具体xml里是如何找到的类,以及怎么注入的,是通过Java反射机制实现的,在这里具体不探讨。
结语
- 了解ioc原理,xml文件书写(property属性,ref注入值),spring调用bean的接口。
- 一头扎进spring:Java学习路线