仿Spring解析配置文件乞丐版
package com.ruide.spring;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ClassPathXmlApplicationContext implements ApplicationContext{
//创建容器来管理对象,也就是存放对象
//键值代表的是对象的名字
public static Map<String,BeanMessage> map=new HashMap<String,BeanMessage>();
//解析配置文件,将属性信息存入在PropertyMessage中,将bean信息放在beanMessage中,将所有的
//对象信息放在map容器中
public ClassPathXmlApplicationContext(String path){
InputStream in=this.getClass().getClassLoader().getResourceAsStream(path);
SAXReader reader=new SAXReader();
Document doc=null;
try {
doc=reader.read(in);
Element root=doc.getRootElement();
List<Element> beans=root.elements("bean");
for(Element bean:beans){
String idname=bean.attributeValue("id");
System.out.println(idname);
String classname=bean.attributeValue("class");
System.out.println(classname);
List<PropertyMessage> pms=new ArrayList<PropertyMessage>();
List<Element> properties=bean.elements("property");
for(Element property:properties){
String propertyname=property.attributeValue("name");
System.out.println(propertyname);
String propertyref=property.attributeValue("ref");
System.out.println(propertyref);
PropertyMessage pm=new PropertyMessage();
pm.setPropertyname(propertyname);
pm.setRefname(propertyref);
pms.add(pm);
}
BeanMessage bm=new BeanMessage();
bm.setClassname(classname);
bm.setProperties(pms);
map.put(idname, bm);
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public Object getBean(String id) {
//利用反射来生成对象
BeanMessage bm=map.get(id);
String classname=bm.getClassname();
System.out.println(classname);
Object obj=null;
try {
//创建对象
obj=Class.forName(classname).newInstance();
//利用反射给属性赋值
Class cla=obj.getClass();
//System.out.println(cla);
List<PropertyMessage> properties=bm.getProperties();
for(PropertyMessage pm:properties){
String propertyname=pm.getPropertyname();
String refname=pm.getRefname();
Field field=cla.getDeclaredField(propertyname);
String methodname="set"+propertyname.substring(0,1).toUpperCase()+propertyname.substring(1);
System.out.println(methodname);
Method method=cla.getDeclaredMethod(methodname,field.getType());
//创建注入的对象
Object param=Class.forName(map.get(refname).getClassname()).newInstance();
System.out.println(param);
method.invoke(obj, param);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
技术小白,有误区劳烦大佬指点
喜欢的小伙伴可以点个关注给个赞哦