现在的位置: 首页 > 综合 > 正文

一个IOC简单实现方法

2013年12月06日 ⁄ 综合 ⁄ 共 2574字 ⁄ 字号 评论关闭

        下面是一个简单的IOC实现,代码较少只是为了便于理解IOC这个概念。

        首先说下什么事IOC,IOC(Inversion of Control),控制反转。  什么意思哪,就是设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。也可以理解为,将对象的创建和获取提取到外部。由外部容器提供需要的组件

         我这个代码是基于“学无止境”网友的介绍的基础上修改的    地址为:http://www.cnblogs.com/springcsc/archive/2009/12/02/1615500.html。

      1.  首先贴出代码结构,如下图

               

       2附上类,由于在类中都做了详细的说明,所以就不在介绍了。

  Kissable.java

      

 package com.wzpmt.entity.boy;

public class Kissable {

    public void kiss(){
        System.out.println("父类的方法");
    }
}

LiSi.java

package com.wzpmt.entity.boy;


public class LiSi extends Kissable{

	public void kiss() {
		System.out.println("非常丑的李四");
	}

	
}

ZhanSan.java

package com.wzpmt.entity.boy;


public class ZhanSan extends Kissable{

	@Override
	public void kiss() {
		System.out.print("非常酷的张三");
	}
	
	
}

Girl.jva

package com.wzpmt.entity.girl;

import com.wzpmt.entity.boy.Kissable;
import com.wzpmt.ioc.IocUtil;

public class Girl {
	Kissable kissable=(Kissable) IocUtil.getEntity();
	
	public void kiss(){
		System.out.println("我想kiss");
		kissable.kiss();
	}
}

IocUtil.java

package com.wzpmt.ioc;


public class IocUtil {
	public static Object getEntity(){
		 //通过外部容器获得类路径
		String classPaht=ReadConfig.getClassPath(); 
		if(classPaht==null)
			return null;
		try {
			return (Object)Class.forName(classPaht).newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

ReadConfig.java

package com.wzpmt.ioc;

import java.io.FileInputStream;
import java.util.Properties;

public class ReadConfig {
	static Properties prop;
	static{
		try {
			//获取ioc.properties所在目录  
			String path=getRootPath()+"ioc.properties";
			System.out.println(path);
			FileInputStream fi = new FileInputStream(path);
			prop=new Properties();
			prop.load(fi);
			fi.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static String getClassPath(){
		if(prop==null)
			return null;
		return prop.get("kiss").toString();
	}
	
	private static String getRootPath(){
			String path=Thread.currentThread().getContextClassLoader().getResource("").getPath();
			//替换空格产生的%20
			path=path.replace("%20", " ");
			//由于路径第一个字符是/ ,所以去掉
			//return path.substring(1);  
			// 测试下可以不用去掉  /D:/work/zqgame 和  D:/work/zqgame 都可以得到正确位置
			return path;
	}
	
	public static void main(String[] args) {
		//当前文件所在路径
		//String path=ReadConfig.class.getResource("").getPath();
		//获得bin路径
		
		System.out.println(getRootPath());
	}
}

Test.java

package com.wzpmt.test;

import com.wzpmt.entity.girl.Girl;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Girl girl=new Girl();
		girl.kiss();

	}

}

ioc.properties

#kiss=com.wzpmt.entity.boy.LiSi
kiss=com.wzpmt.entity.boy.ZhanSan

这个程序实现了Girl想kiss谁,必须有容器提供,可以在ioc.properties中配置 欢迎共同探讨

抱歉!评论已关闭.