您的位置:首页 > 编程语言 > Java开发

自定义spring容器--spring容器读取bean配置文件的原理

2013-05-21 11:55 666 查看
自定义spring容器类
package junit.test;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import org.apache.commons.beanutils.ConvertUtils;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.XPath;import org.dom4j.io.SAXReader;/** * 自定义spring容器 * */public class MyClassPathXMLApplicationContext {	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();	private Map<String, Object> sigletons = new HashMap<String, Object>();		public MyClassPathXMLApplicationContext(String filename){		this.readXML(filename);		this.instanceBeans();		this.injectObject();	}	/**	 * 为bean对象的属性注入值	 */	private void injectObject() {		for(BeanDefinition beanDefinition : beanDefines){			Object bean = sigletons.get(beanDefinition.getId());			if(bean!=null){				try {					PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();					for(PropertyDefinition propertyDefinition : beanDefinition.getPropertys()){						for(PropertyDescriptor properdesc : ps){							if(propertyDefinition.getName().equals(properdesc.getName())){								Method setter = properdesc.getWriteMethod();//获取属性的setter方法 ,private								if(setter!=null){									Object value = null;									if(propertyDefinition.getRef()!=null && !"".equals(propertyDefinition.getRef().trim())){										value = sigletons.get(propertyDefinition.getRef());									}else{										value = ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());									}									setter.setAccessible(true);									setter.invoke(bean, value);//把引用对象注入到属性								}								break;							}						}					}				} catch (Exception e) {				}			}		}	}	/**	 * 完成bean的实例化	 */	private void instanceBeans() {		for(BeanDefinition beanDefinition : beanDefines){			try {				if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim()))					sigletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassName()).newInstance());			} catch (Exception e) {				e.printStackTrace();			}		}			}	/**	 * 读取xml配置文件	 * @param filename	 */	private void readXML(String filename) {	       SAXReader saxReader = new SAXReader();   	        Document document=null;   	        try{	         URL xmlpath = this.getClass().getClassLoader().getResource(filename);	         document = saxReader.read(xmlpath);	         Map<String,String> nsMap = new HashMap<String,String>();	         nsMap.put("ns","http://www.springframework.org/schema/beans");//加入命名空间	         XPath xsub = document.createXPath("//ns:beans/ns:bean");//创建beans/bean查询路径	         xsub.setNamespaceURIs(nsMap);//设置命名空间	         List<Element> beans = xsub.selectNodes(document);//获取文档下所有bean节点 	         for(Element element: beans){	            String id = element.attributeValue("id");//获取id属性值	            String clazz = element.attributeValue("class"); //获取class属性值        	            BeanDefinition beanDefine = new BeanDefinition(id, clazz);	            XPath propertysub =  element.createXPath("ns:property");	            propertysub.setNamespaceURIs(nsMap);//设置命名空间	            List<Element> propertys = propertysub.selectNodes(element);	            for(Element property : propertys){	            		            	String propertyName = property.attributeValue("name");	            	String propertyref = property.attributeValue("ref");	            	String propertyValue = property.attributeValue("value");	            	PropertyDefinition propertyDefinition = new PropertyDefinition(propertyName, propertyref, propertyValue);	            	beanDefine.getPropertys().add(propertyDefinition);	            }	            beanDefines.add(beanDefine);	         } 	        }catch(Exception e){   	            e.printStackTrace();	        }	}	/**	 * 获取bean实例	 * @param beanName	 * @return	 */	public Object getBean(String beanName){		return this.sigletons.get(beanName);	}}
bean类
package junit.test;import java.util.ArrayList;import java.util.List;public class BeanDefinition {	private String id;	private String className;	private List<PropertyDefinition> propertys = new ArrayList<PropertyDefinition>();		public BeanDefinition(String id, String className) {		this.id = id;		this.className = className;	}	public String getId() {		return id;	}	public void setId(String id) {		this.id = id;	}	public String getClassName() {		return className;	}	public void setClassName(String className) {		this.className = className;	}	public List<PropertyDefinition> getPropertys() {		return propertys;	}	public void setPropertys(List<PropertyDefinition> propertys) {		this.propertys = propertys;	}	}
属性类
package junit.test;public class PropertyDefinition {	private String name;	private String ref;	private String value;		public String getValue() {		return value;	}	public void setValue(String value) {		this.value = value;	}	public PropertyDefinition(String name, String ref, String value) {		this.name = name;		this.ref = ref;		this.value = value;	}		public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public String getRef() {		return ref;	}	public void setRef(String ref) {		this.ref = ref;	}	}
测试类
package junit.test;import org.junit.BeforeClass;import org.junit.Test;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.itcast.service.PersonService;public class SpringTest {	@BeforeClass	public static void setUpBeforeClass() throws Exception {	}	@Test public void instanceSpring(){		MyClassPathXMLApplicationContext ctx = new MyClassPathXMLApplicationContext("beans.xml");		PersonService personService = (PersonService)ctx.getBean("personService");		personService.save();		//ctx.close();			}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: