Spring IOC 实现原理浅谈

      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名称);通过类名来获取对应的类,再通过类来创建实例对象。

 

你可能感兴趣的:(spring ioc)