spring学习之Ioc

在传统的模式之中,对象的创建和类与类之间的关系表示是通过new对象创建。

在spring中对象的创建以及他们之间的依赖关系,通过spring容器来管理。

准备条件:

磁盘接口

public interface Disk {

	public void read();
	public void write(String data);
	
}

usb类
public class UsbDisk implements Disk {

	@Override
	public void read() {
		// TODO Auto-generated method stub
		System.out.println("U盘开始读取数据...");
	}

	@Override
	public void write(String data) {
		// TODO Auto-generated method stub
		System.out.println("U盘开始写入数据"+data);
	}

}
移动硬盘类

public class MoveDisk implements Disk {

    
    @Override
    public void read() {
        // TODO Auto-generated method stub
        System.out.println("硬盘开始读取数据...");

    }

    @Override
    public void write(String data) {
        // TODO Auto-generated method stub
        System.out.println("硬盘开始写入数据"+data);

    }

传统的编程模式之中,测试方法如下:

import junit.framework.TestCase;

public class Test extends TestCase{

	public void testRead(){
		Disk disk = new MoveDisk();
		disk.read();
	}
	
	public void testWrite(){
		Disk disk=new MoveDisk();
		disk.write("hello");
	}
}

这是一种耦合度很不好的设计模式,设想一下,假如我们此时需要实例化usbDisk()对象,则需要在代码中改写构造方法。而在spring中只需要修改spring容器。
那spring容器是如何配置的呢?

1.applicationContext.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" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
	http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean name="disk" class="com.qzp.MoveDisk"></bean>
    	
</beans>

2.在测试代码中做如下修改

import junit.framework.TestCase;

public class Test extends TestCase{

	public void testRead(){
		ApplicationContext cxt=new ClassPathXmlApplicationContext("config/applicationContext.xml");
		//Disk disk = new MoveDisk();
		Disk disk=(Disk)cxt.getBean("disk");
		disk.read();
	}
	
	public void testWrite(){
		Disk disk=new MoveDisk();
		disk.write("hello");
	}
}
spring的实质,先加载applicationContext.xml文件,然后通过jdom对xml文件中的bean进行解析,解析以后获取其对应的类名,通过类加载机制获取其类所对应的方法。

这样的话,修改实例化对象只需在spring容器中修改就可以了。

下面模拟的是一个beanFactory实例化的方法

public class BeanFactory {

	//获取一个bean实例的静态方法
	public static Object getBean(String beanName){
		try {
			//运用反射机制
			return Class.forName(beanName).newInstance();
		} catch (Exception ex) {
			// TODO: handle exception
			ex.printStackTrace();
			return null;			
		}	
	}
}

public class TestBeanFactory extends TestCase{

	public void testBean(){
		Disk disk=(Disk)BeanFactory.getBean("com.qzp.dao.impl.MoveDisk");
		disk.read();
		disk.write("hello");
	}
}



你可能感兴趣的:(设计模式,spring,反射,IOC,工厂模式)