读书人

模拟Spring治理bean

发布时间: 2012-08-27 21:21:57 作者: rapoo

模拟Spring管理bean

package junit.test;

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.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;


public class ItcastClassPathXMLApplicationContext {
?private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
?private Map<String, Object> sigletons = new HashMap<String, Object>();
?
?public ItcastClassPathXMLApplicationContext(String filename){
??this.readXML(filename);
??this.instanceBeans();
?}
?/**
? * 完成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);
???????????? beanDefines.add(beanDefine);
????????? }??
???????? }catch(Exception e){??
???????????? e.printStackTrace();
???????? }
?}
?/**
? * 获取bean实例
? * @param beanName
? * @return
? */
?public Object getBean(String beanName){
??return this.sigletons.get(beanName);
?}
}

?

?

?

spring管理bean的三种方式:

?<bean id="personService"
????????? factory-method="createPersonServiceBean"/>
?<bean id="personServiceFactory" factory-bean="personServiceFactory" factory-method="createPersonServiceBean2"/>

?

bean的作用域:

?<bean id="personService" scope="prototype"></bean>

读书人网 >软件架构设计

热点推荐