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 閱讀(280) 評論(0)  編輯  收藏 所屬分類: J2EE/SSH

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


          網站導航:
           
          主站蜘蛛池模板: 祁门县| 武乡县| 莱西市| 连山| 阜南县| 息烽县| 甘泉县| 望都县| 汶上县| 尤溪县| 迁安市| 闵行区| 龙泉市| 农安县| 肃南| 洛川县| 广饶县| 灵石县| 武冈市| 泗水县| 大化| 民权县| 宜宾市| 曲阜市| 民和| 敦化市| 咸阳市| 高碑店市| 万载县| 江北区| 玛沁县| 翁牛特旗| 白玉县| 青海省| 堆龙德庆县| 通山县| 富顺县| 高邑县| 沙田区| 冀州市| 邹平县|