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

Spring容器内部的实现机制

2012-10-24 20:58 260 查看
class BeanDefinition 中保存着bean的id和class

class ClassPathXMLApplicationContext 模仿了ApplicationContext 的功能 先读取文件,将文件中的bean保存在List集合中 实例化时,将bean拿到Map中,根据传进来的beanName 来使用那个bean

//用来存放bean的信息

private List<BeanDefinition> BeanDefines = new ArrayList<BeanDefinition>();

//保存bean

private Map<String ,Object > sigletons =new HashMap<String, Object>();

public ClassPathXMLApplicationContext(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) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//读取application.xml 文件

private void readXML(String fileName) {

SAXReader saxReader = new SAXReader();

Document document =null;

try{

URL xmlPath=this.getClass().getClassLoader().getResource(fileName);

//System.out.println(xmlPath);file:/G:/workspaces1/spring/bin/beans.xml

document =saxReader.read(xmlPath);

Map<String,String> nsMap=new HashMap<String, String>();

//加入命名空间

nsMap.put("ns","http://www.springframework.org/schema/beans");

//创建beans/bean的查询路径

XPath xsub = document.createXPath("//ns:beans/ns:bean");

//System.out.println(xsub);[XPath: /descendant-or-self::node()/child::ns:beans/child::ns:bean]

//设置命名空间

xsub.setNamespaceURIs(nsMap);

//获取文档下的所有的bean节点

List<Element> beans = xsub.selectNodes(document);

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实例

public Object getBean(String beanName){

return this.sigletons.get(beanName);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: