1. 程式人生 > >xml簡易版Spring IoC

xml簡易版Spring IoC

先看一下程式碼吧 寫的也不好 後期自己在好好改正一下

 

 

package com.jzw.xmlcontext;

import java.io.InputStream;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


public class MyClassPathXmlApplicationContext {
	
	//這個concurrenthashmap用於存放xml檔案中資訊 有 id class  目前還沒有用到這個 後期打算在精選一遍
	private ConcurrentHashMap< String, String> xmlElement =new ConcurrentHashMap<String, String>();
	
	private String xmlPath;
	//先來一個構造方法
	public MyClassPathXmlApplicationContext(String xmlPath) {
		this.xmlPath = xmlPath;
	}
	//主要呼叫的是getBean方法  傳入一個beanId
	/*
	 * 分三步 
	 * 1、解析xml檔案 獲取裡面的bean資訊
	 * 2、對比傳過來的beanId 看看裡面有沒有對應的bean
	 * 3、通過反射呼叫該物件。
	 */
	//@SuppressWarnings("deprecation")
	public Object getBean(String beanId) throws Exception {
		//如果呼叫getBean不傳引數的話 
		if (beanId == null) {
			throw new Exception("beanId 為空");
		}
		List<Element> elements = readXml();
		if(elements==null) {
			throw new Exception("xml 為空");
		}
		//然後我獲取到bean節點之後需要去迴圈對比這個bean id
		for (Element element : elements) {
			if(element.attributeValue("id").equals(beanId)) {
				//如果有的話那麼及時找到這個bean 然後就返回這個
				String className = element.attributeValue("class");
				System.out.println("獲取到這個bean的class路徑為:  " + className);
				//然後用過反射機制返回
				Class class1= Class.forName(className);
				return class1.newInstance();
			}
		}
		throw new Exception("沒有對應的id配置");
	}
	
	public List<Element> readXml() throws DocumentException {
		SAXReader saxread = new SAXReader();
		//找到xml檔案 並解析成InputStream
		InputStream inputStream = saxread.getClass().getClassLoader().getResourceAsStream(xmlPath);
		
		Document document = saxread.read(inputStream);
		
		Element rootElement = document.getRootElement(); //獲取根節點
		//獲取根節點下所有的子節點
	    List<Element> elements = rootElement.elements();
	    
	    return elements;
	    //我打算這樣  將所有的子節點的 id class 資訊存到一個ConcurrentHashMap中
	    
	}	
}

說一下過程

準備工作做完之後 

1、想辦法獲取xml裡面的配置資訊

     第一步:找到路徑         InputStream inputStream = saxread.getClass().getClassLoader().getResourceAsStream(xmlPath);

      這就可以獲取路徑並將它解析成inputStream  (很神奇,我現在還沒去看裡面的原理)

      第二步  : 獲取節點

       

        獲取了節點之後你就可以獲取其他的所有資訊   獲取裡面的 id class 

  2、 獲取id  class  對比傳過來的引數beanId

         利用這個方法

          

           你就可以獲取這個id裡面的值  返回一個字串  對於class 也是一樣

3、  通過反射機制 獲取例項物件

這個就簡單了    Class.forName(className).newInstance();

          

 

總結  : 自己還有有很多不懂的  SAX解析xml檔案  裡面的屬性獲取   。