簡單模擬spring的容器管理bean

字號:

package com.spring;
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.xpath.XPath;
    import com.vo.BeanDefinition;
    /**
    * 簡單模擬spring的ClassPathXmlApplicationContext spring容器管理bean
    *
    * @author examda
    *
    */
    @SuppressWarnings("unchecked")
    public class MyApplicationContext
    {
    private List list = new ArrayList();
    private Map sigletons = new HashMap();
    public MyApplicationContext(String fileName)
    {
    this.readXML(fileName);
    try
    {
    instanceBeans();
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    /**
    * 實例化所有bean
    *
    * @throws InstantiationException
    * @throws IllegalAccessException
    * @throws ClassNotFoundException
    */
    private void instanceBeans() throws InstantiationException,
    IllegalAccessException, ClassNotFoundException
    {
    for (BeanDefinition bean : list)
    {
    if (null != bean.getClassName() && bean.getClassName().length() > 0)
    sigletons.put(bean.getId(), Class.forName(bean.getClassName())
    .newInstance());
    }
    }
    /**
    * 讀取xml配置
    *
    * @param fileName
    */
    public void readXML(String fileName)
    {
    SAXBuilder builder = new SAXBuilder();
    URL url = this.getClass().getClassLoader().getResource(fileName);
    try
    {
    Document doc = builder.build(url);
    XPath xpath = XPath.newInstance("http://ns:beans/ns:bean");
    xpath.addNamespace("ns",
    "http://www.springframework.org/schema/beans");
    List beans = xpath.selectNodes(doc);
    for (Element bean : beans)
    {
    String id = bean.getAttributeValue("id");
    String className = bean.getAttributeValue("class");
    BeanDefinition beanDefinition = new BeanDefinition(id,
    className);
    list.add(beanDefinition);
    }
    }
    catch (JDOMException e)
    {
    e.printStackTrace();
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    /**
    * 得到指定id的bean
    *
    * @param id
    * @return
    */
    public Object getBean(String id)
    {
    return sigletons.get(id);
    }
    }
    測試:
    @Test
    public void testMyUserService()
    {
    MyApplicationContext ctx = new MyApplicationContext("beans.xml");
    UserService us = (UserService) ctx.getBean("userService");
    us.print();
     }