Spring解析配置文件乞丐版

仿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;
	}

}

技术小白,有误区劳烦大佬指点
喜欢的小伙伴可以点个关注给个赞哦

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值