众所周知,Spring的IOC主要就是使用了java的反射机制来完成的。
IOC主要步骤:
1.配置XML文件。
我们模拟一下Spring简单的一个XML文件。
hello
123
这份XML文件中我们在beans下设置了一个bean,包含两个属性:userName和password。接下来要做的就是如何通过这份XML文件把这两个属性的属性值注入到指定的javabean中。
2.编写BeanFactory工厂类,完成XML解析。
package com.test.day002;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.sun.xml.internal.ws.org.objectweb.asm.Attribute;
public class BeanFactory {
Document doc=null;
private Map beanMap = new HashMap();
void init(String xml) throws Exception{
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
//从class目录下获取指定的xml文件
InputStream ins = classLoader.getResourceAsStream(xml);
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db;
db = dbf.newDocumentBuilder();
doc=db.parse(ins);
//根节点
Element root=doc.getDocumentElement();
//bean节点
NodeList beanNodeList=root.getElementsByTagName("bean");
for(int i = 0 ;i
Element beanElement=(Element)beanNodeList.item(i);
//获取bean的属性id和class
String id = beanElement.getAttribute("id");
String cls = beanElement.getAttribute("class");
//利用Java反射机制,通过class的名称获取Class对象
Class bean = Class.forName(cls);
//获取对应class的信息
java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);
//获取其属性描述
java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();
//设置值的方法
Method mSet = null;
//创建一个对象
Object obj = bean.newInstance();
NodeList propertyNodeList=beanElement.getElementsByTagName("property");
for(int j = 0 ;j
Element propertyElement=(Element)propertyNodeList.item(j);
String name = propertyElement.getAttribute("name");
NodeList valueNodeList=propertyElement.getElementsByTagName("value");
for(int k = 0 ;k
Element valueElement=(Element)valueNodeList.item(k);
String value = valueElement.getTextContent();
for (int l = 0; l < pd.length; l++) {
if (pd[l].getName().equalsIgnoreCase(name)) {
mSet = pd[l].getWriteMethod();
//利用Java的反射极致调用对象的某个set方法,并将值设置进去
mSet.invoke(obj, value);
}
}
}
}
//将对象放入beanMap中,其中key为id值,value为对象
beanMap.put(id, obj);
}
}
public Object getBean(String beanName) {
Object obj = beanMap.get(beanName);
return obj;
}
}
接下来我们可以测试一下。
JavaBean类
public class JavaBean {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class Test03 {
public static void main(String[] args) throws Exception {
BeanFactory factory = new BeanFactory();
factory.init("com/test/day002/config.xml");
Test03JavaBean javaBean = (Test03JavaBean) factory.getBean("javaBean");
System.out.println("userName=" + javaBean.getUserName());
System.out.println("password=" + javaBean.getPassword());
}
}
输出
userName=hello
password=123 以上内容参考了网上资料,做了修改整理,便于自己理解。