下面是一个简单的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中配置 欢迎共同探讨