spring管理bean容器(笔记)[继]

当了解了spring容器的实例化之后,我们可以进行简单的进行模拟这个过程:

1.首先进行加载spring的xml配置文件

2.进行解析这个配置文件,将节点映射成一个类

3.进行对<bean进行实例化,并存在一个集合map中

4.然后在这个集合中根据id进行bean。

mybens.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    
    <!-- 使用类构造器实例化 -->      
    <bean id="refrectShili" class="cn.can.dao.impl.RefrectShili"></bean>
</beans>

节点对应的类,这里只简单的存储id和class类型,采用的是xml配置使用bean的类构造器进行实例化

package cn.can.myspring;

//xml中节点的
//<bean id="refrectShili" class="cn.can.dao.impl.RefrectShili"></bean>对应的类
public class MyBean {
    private String id;
    private String className;
    
    public MyBean() {
        super();
    }
    public MyBean(String id, String className) {
        super();
        this.id = id;
        this.className = className;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
    
}

关键是下面的解析xml和实例化,用了xpath进行解析xml和反射机制进行实例化类。

package cn.can.myspring;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import cn.can.myspring.exception.NoIdClassException;

public class MyApplicationContext {
    // 因为bean是多个的
    private List<MyBean> myBeans = new ArrayList<MyBean>();
  //存储实例化之后的引用
private Map<String, Object> singles = new HashMap<String, Object>(); // 这里可以传入一个xml,或者传入多个xml public MyApplicationContext() { } public Object getBean(String id) throws NoIdClassException{ if(singles.size() <= 0){ throw new NoIdClassException("不存在这个类"); } Object obj = singles.get(id); if(obj == null){ throw new NoIdClassException("不存在这个类"); } return obj; } public MyApplicationContext(String fileName) { init(fileName);// 获得xml的信息之后 initObject();// 进行实例化<bean } // 2.进行实例化 private void initObject() { try { if (myBeans != null && myBeans.size() > 0) { // 遍历bean // <xml中的<bean 节点,可以抽象成一个类 for (MyBean bean : myBeans) { String id = bean.getId(); String clazz = bean.getClassName(); if (id != null && !"".equals(id)) { if (clazz != null && !"".equals(clazz)) { // 这个时候进行实例化 Class cl = Class.forName(clazz); Object o = cl.newInstance(); singles.put(id, o); } } } } } catch (Exception e) { } } public MyApplicationContext(String[] fileNames) { } // 1.进行加载xml,解析xml文件 private void init(String fileName) { SAXReader saxReader = new SAXReader(); Document document = null; try { URL xmlpath = this.getClass().getClassLoader() .getResource(fileName); document = saxReader.read(xmlpath); Map<String, String> nsMap = new HashMap<String, String>(); nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空间 XPath xsub = document.createXPath("//ns:beans/ns:bean");// 创建beans/bean查询路径 xsub.setNamespaceURIs(nsMap);// 设置命名空间 List<Element> beans = xsub.selectNodes(document);// 获取文档下所有bean节点 for (Element e : beans) { String id = e.attributeValue("id");// 获取id属性值 String clazz = e.attributeValue("class"); // 获取class属性值 MyBean myBean = new MyBean(id, clazz);// 得到一个<bean></bean> myBeans.add(myBean);// 将xml中的所有bean都进行解析 } } catch (Exception e) { } } }

在这基础上可以进行继续扩展。考虑<bean中的所有子节点和属性如何解析和处理。

posted @ 2014-04-07 22:33  迷失的小猪  阅读(454)  评论(0)    收藏  举报