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