當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
手动实现Spring中的IOC容器
生活随笔
收集整理的這篇文章主要介紹了
手动实现Spring中的IOC容器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
注意:這就是一個用于學習理解Spring中IOC容器的簡單例子!!!!
1、IOC容器實現的過程:
- 加載XML的配置文件,并且遍歷文件中的標簽
- 獲取配置文件中單個Bean的ID和Class屬性,然后根據Class文件加載對應的類,并且創建Bean的實例對象
- 獲取屬性標簽中的屬性值,填充到Bean的中
- 將設置好的Bean注冊到IOC容器中
2、代碼展示:
package com.baozi.Test;import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.FileInputStream; import java.io.InputStream; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map;/*** @author BaoZi* @create 2019-07-19-8:54*/ public class SimpleIOC {private Map<String, Object> beanMap = new HashMap<>();public SimpleIOC(String location) throws Exception {loadBeans(location);}public Object getBean(String name) {Object bean = beanMap.get(name);if (bean == null) {throw new IllegalArgumentException("there is no bean with name " + name);}return bean;}private void loadBeans(String location) throws Exception {// 加載 xml 配置文件//把要解析的 XML 文檔轉化為輸入流對象,以便 DOM 解析器解析它InputStream inputStream = new FileInputStream(location);/*** javax.xml.parsers 包中的DocumentBuilderFactory用于創建DOM模式的解析器對象 ,* DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法 ,* 這個方法會根據本地平臺默認安裝的解析器,自動創建一個工廠的對象并返回。*///調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。DocumentBuilder docBuilder = factory.newDocumentBuilder();//調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個文檔的 Document 對象,// 進行可以利用DOM特性對整個XML文檔進行操作了。Document doc = docBuilder.parse(inputStream);//得到 XML 文檔的根節點Element root = doc.getDocumentElement();//得到節點的子節點NodeList nodes = root.getChildNodes();// 遍歷 <bean> 標簽for (int i = 0; i < nodes.getLength(); i++) {Node node = nodes.item(i);if (node instanceof Element) {Element ele = (Element) node;String id = ele.getAttribute("id");String className = ele.getAttribute("class");// 加載 beanClassClass beanClass = null;try {beanClass = Class.forName(className);} catch (ClassNotFoundException e) {e.printStackTrace();return;}// 創建 beanObject bean = beanClass.newInstance();// 遍歷 <property> 標簽//使用Document對象的getElementsByTagName()方 法,我們可以得到一個NodeList對象,// 一個Node對象代表了一個XML文檔中的一個標簽元素,而NodeList對象,觀其名而知其意,// 所代表的是一個Node對象的列表:NodeList propertyNodes = ele.getElementsByTagName("property");for (int j = 0; j < propertyNodes.getLength(); j++) {Node propertyNode = propertyNodes.item(j);if (propertyNode instanceof Element) {Element propertyElement = (Element) propertyNode;String name = propertyElement.getAttribute("name");String value = propertyElement.getAttribute("value");// 利用反射將 bean 相關字段訪問權限設為可訪問Field declaredField = bean.getClass().getDeclaredField(name);declaredField.setAccessible(true);if (value != null && value.length() > 0) {// 將屬性值填充到相關字段中declaredField.set(bean, value);} else {//這里是Bean對象屬性中循環引用問題(先不做處理)String ref = propertyElement.getAttribute("ref");if (ref == null || ref.length() == 0) {throw new IllegalArgumentException("ref config error");}// 將引用填充到相關字段中declaredField.set(bean, getBean(ref));}// 將 bean 注冊到 bean 容器中registerBean(id, bean);}}}}}//這里模仿Bean對象注入IOC容器中的過程private void registerBean(String id, Object bean) {beanMap.put(id, bean);} }
3、測試實例:
Bean的實力對應的類:
public class Car {private String name;private String length;private String width;private String height;private Wheel wheel;//.......................... }public class Wheel {private String brand;private String specification ;// ............................ }測試用的XML文件:
<beans><bean id="wheel" class="com.baozi.Wheel"><property name="brand" value="Michelin" /><property name="specification" value="265/60 R18" /></bean><bean id="car" class="com.baozi.Car"><property name="name" value="Mercedes Benz G 500"/><property name="length" value="4717mm"/><property name="width" value="1855mm"/><property name="height" value="1949mm"/><property name="wheel" ref="wheel"/></bean> </beans>測試類:
public class SimpleIOCTest {@Testpublic void getBean() throws Exception {String location = SimpleIOC.class.getClassLoader().getResource("spring-test.xml").getFile();SimpleIOC bf = new SimpleIOC(location);Wheel wheel = (Wheel) bf.getBean("wheel");System.out.println(wheel);Car car = (Car) bf.getBean("car");System.out.println(car);} }
轉載于:https://www.cnblogs.com/BaoZiY/p/11375242.html
總結
以上是生活随笔為你收集整理的手动实现Spring中的IOC容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lambda表达式的使用
- 下一篇: 关于Spring中IOC容器和AOP协同