Spring采用反射和动态代理实现IOC(Inversion of control),主要目的是减少类与类之间的耦合。Spring在这中间充当一个工厂的作用,对使用Spring的类进行控制管理。主要过程可以分成几个步骤:
1、读取XML文件bean.xml
//读取指定的配置文件
SAXReader reader = new SAXReader();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//从class目录下获取指定的xml文件
InputStream ins = classLoader.getResourceAsStream(bean.xml);
<?xml version="1.0" encoding="GBK"?>
<beans>
<bean id="school" class="xwq.School">
<!-- 为schoolName属性注入普通属性值 -->
<property name="schoolName" value="夕阳学校"/>
<!-- 为teacher属性注入普通属性值 -->
<property name="teacher" ref="teacher"/>
</bean>
<!-- 配置两个Bean实例 -->
<bean id="student" class="xwq.Student"/>
<bean id="teacher" class="xwq.Teacher"/>
<!-- 配置一个prototype行为的Bean实例 -->
<bean id="classRoom" class="xwq.ClassRoom" scope="prototype"/>
</beans>
2、解析XML文件
//读取根节点
Document doc = reader.read(ins);
Element root = doc.getRootElement();
//循环遍历获取bean
for (Iterator i = root.elementIterator("bean"); i.hasNext();){
Object obj = bean.newInstance();
}
//取出id、class、scope等属性值
Element foo = (Element) i.next();
//获取bean的属性id和class
Attribute id = foo.attribute("id");
Attribute cls = foo.attribute("class");
//通过反射获取对应的类
Class bean = Class.forName(cls.getText());
//循环遍历每个bean下面的property
for (Iterator ite = foo.elementIterator("property"); ite.hasNext();)
//取出poperty下的值,循环遍历
Element foo2 = (Element) ite.next();
获取该property的name属性
Attribute name = foo2.attribute("schoolName");
//解析的结果集放入map中存储,需要的时候直接获取
beanMap.put(id.getText(), obj);
3、创建实例对象
初始化Spring时,通过bean工厂初始化XML文件,需要实例对象时,通过BeanFactory类中的Class bean = Class.forName(bean名称);通过类名来获取对应的类,再通过类来创建实例对象。