xml簡易版Spring IoC
阿新 • • 發佈:2018-12-16
先看一下程式碼吧 寫的也不好 後期自己在好好改正一下
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檔案 裡面的屬性獲取 。