wangflood

          精心維護一個技術blog,為了工作,也是愛好。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            14 Posts :: 19 Stories :: 8 Comments :: 0 Trackbacks
           spring IOC達到松耦合的目的,便于測試。我很喜歡"spirng容器"的說法,spring根據讀取bean.xml,再用java反射機制,組合一些類,完成程序。其實,實現起來也不太難。不信你看。

          模仿spring,BeanFactory
          package com.wang.spring;

          public interface BeanFactory {
              
          public Object getBean(String name);
          }


          主要類:ClassPathXmlApplicationContext,當然spring的這個類里有國際化等功能實現,這里就簡了。
          package com.wang.spring;

          import java.lang.reflect.Method;
          import java.util.HashMap;
          import java.util.List;
          import java.util.Map;

          import org.jdom.Document;
          import org.jdom.Element;
          import org.jdom.input.SAXBuilder;

          import wang.spring.dao.UserDao;
          import wang.spring.dao.impl.UserDaoImpl;

          public class ClassPathXmlApplicationContext implements BeanFactory {

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

              
          // IOC Inverse of Control DI Dependency Injection
              public ClassPathXmlApplicationContext() throws Exception {
                  SAXBuilder sb 
          = new SAXBuilder();

                  Document doc 
          = sb.build(this.getClass().getClassLoader()
                          .getResourceAsStream(
          "beans.xml")); // 構造文檔對象
                  Element root = doc.getRootElement(); // 獲取根元素HD
                  List list = root.getChildren("bean");// 取名字為disk的所有元素
                  for (int i = 0; i < list.size(); i++{
                      Element element 
          = (Element) list.get(i);
                      String id 
          = element.getAttributeValue("id");
                      String clazz 
          = element.getAttributeValue("class");
                      Object o 
          = Class.forName(clazz).newInstance();
                      System.out.println(id);
                      System.out.println(clazz);
                      beans.put(id, o);
          //i=1  new UserDaoImpl();

                      
          for (Element propertyElement : (List<Element>) element
                              .getChildren(
          "property")) {
                          String name 
          = propertyElement.getAttributeValue("name"); // 得到userDAO
                          String bean = propertyElement.getAttributeValue("bean"); // u
                          
          //相當于    UserDao u = new UserDaoImpl();
                          Object beanObject = beans.get(bean);// UserDAOImpl instance

                          String methodName 
          = "set" + name.substring(01).toUpperCase()
                                  
          + name.substring(1);
                          System.out.println(
          "method name = " + methodName);

                          Method m 
          = o.getClass().getMethod(methodName,
                                  beanObject.getClass().getInterfaces()[
          0]);
                          m.invoke(o, beanObject);
                      }


                  }


              }


              
          public Object getBean(String id) {
                  
          return beans.get(id);
              }


          }



          posted on 2010-11-14 09:46 wangflood 閱讀(287) 評論(0)  編輯  收藏 所屬分類: J2EE/SSH

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 芦溪县| 武城县| 禹州市| 广东省| 新郑市| 开鲁县| 同江市| 家居| 韶山市| 白水县| 且末县| 银川市| 乌苏市| 靖远县| 台中县| 清原| 谢通门县| 玉环县| 武义县| 平山县| 夏河县| 始兴县| 汤原县| 尉犁县| 通许县| 板桥市| 益阳市| 广宗县| 林州市| 台北市| 信宜市| 疏附县| 仪征市| 墨脱县| 洪洞县| 铁岭市| 富裕县| 宜宾县| 哈密市| 甘德县| 永平县|