applicationContext.xmljava
<beans> <bean id="user1" class="com.company.User"> <property name="userId" value="1"></property> <property name="userName" value="李四"></property> </bean> <bean id="user2" class="com.company.User"> <property name="userId" value="2"></property> <property name="userName" value="張三"></property> </bean> </beans>
User.javaspring
package com.company; /** * 手寫springioc * * @author 000 * */ public class User { private String userId; private String userName; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public String toString() { return "User [userId=" + userId + ", userName=" + userName + "]"; } }
ClassPathXmlApplicationContext.javaapp
package com.company; import java.io.InputStream; import java.lang.reflect.Field; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ClassPathXmlApplicationContext { private String configFilePath; public ClassPathXmlApplicationContext(String configFilePath) { this.configFilePath = configFilePath; } /* * dom4j解析 */ public Object getBean(String id) throws Exception { // 解析xml SAXReader reader = new SAXReader(); InputStream inputStream = ClassLoader.getSystemResourceAsStream(configFilePath); Document document = reader.read(inputStream); if (document == null) { return null; } // 從項目根目錄下讀取 Element root = document.getRootElement(); // 獲取節點資源 List<Element> list = root.elements(); if (list.size() <= 0) { return null; } Object obj = null; for (Element element : list) { String idString = element.attributeValue("id"); if (!id.equals(idString)) { continue; } // 獲取bean的class地址 String classString = element.attributeValue("class"); // 發射實例化bean Class<?> class1 = Class.forName(classString); obj = class1.newInstance(); // 獲取子類對象 List<Element> elements = element.elements(); if (elements.size() <= 0) { return null; } for (Element element2 : elements) { String name = element2.attributeValue("name"); System.out.println(name); String value = element2.attributeValue("value"); // 使用反射爲對象賦值 Field field = class1.getDeclaredField(name); field.setAccessible(true); field.set(obj, value); } } return obj; } }