Spring4_02_ioc简介

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反射机制实现的,在这里具体不探讨。 

结语


  1. 了解ioc原理,xml文件书写(property属性,ref注入值),spring调用bean的接口。
  2. 一头扎进spring:Java学习路线

猜你喜欢

转载自blog.csdn.net/qq_27163329/article/details/81134687
今日推荐