2.16 模拟Spring IOC容器功能-1
2.17 模拟Spring IOC容器功能-2
什么是IOC?
- 控制反转,把对象创建和对象之间的调用过程交给Spring框架进行管理
- 使用IOC的目的:为了耦合度降低
解释:
模仿 IOC容器的功能,我们利用 Map 集合存放需要的对象,并新建一个 conf.properties 文件存放信息,在获取 对象 之前解析 ioc.properties 文件中的信息,利用反射技术将 conf.properties 文件中的内容通过 Class.forName 的形式解析为 Class 对象放入集合 map 中,这样每次获取对象都会从 map 中进行获取,不需要再 new
Ioc.properties类:
clazz1=cn.edu.xync.myweb.reflect.Person
clazz2=cn.edu.xync.myweb.reflect.Teacher
IOCContainer类:
package cn.edu.xync.myweb.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class IOCContainer {
//用来存放配置文件读取通过反射所创建的对象
private Map<String,Object> container=new HashMap<String,Object>();
public void init() {//读取配置文件
InputStream is=IOCContainer.class.getClassLoader().getResourceAsStream("ioc.properties");//通过当前类的字节码加载器去读取ioc.properties文件,以InputStream类型保存
Properties p=new Properties();
try {
p.load(is);//加载文件
Set<String> propertyNames=p.stringPropertyNames();//返回配置文件中所有属性的名称
Iterator<String> its=propertyNames.iterator();//迭代器遍历
while(its.hasNext()) {
String key=its.next();
String value=p.getProperty(key);//通过key值拿到value,拿到value的目的时通过反射创建对象
//通过反射创建出对象后,添加到Map中
container.put(key,Class.forName(value).newInstance());//通过无参数的构造方法以反射形式创建对象
}
}
catch (InstantiationException e) {
System.err.println("通过配置文件创建对象错误,请检查类完整的包路径名称和类名称是否正确");
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
System.err.println("读取配置文件错误,请检查文件名称或者路径是否正确");
e.printStackTrace();
}
}
public void showElements() {
Set<String> keys=container.keySet();//得到Map中所有key组成的Set
Iterator<String> its=keys.iterator();
while(its.hasNext()) {
String key=its.next();
Object value=container.get(key);
System.out.println("key:"+key+",value:"+value);
}
}
public static void main(String[] args) {
IOCContainer con=new IOCContainer();
con.init();//初始化容器
con.showElements();
}
}
运行结果:
总结:
通过简单的模拟ioc容器功能,再次理解ioc容器,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制,对于spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。
错误:
原因:is这个输入流是空的。加载器没有读取到我的配置文件,因为我没有将ioc.properties放在src根目录文件中,导致读取不到。