隨筆-21  評論-29  文章-0  trackbacks-0
          通過第一個實例我們會有一個疑問,Spring到底是怎么管理Bean的呢?
          我們來模擬Spring的內部實現
          在junit.test下新建ItcastClassPathXMLApplicationContext

          類的完全代碼(這里要引入dom4j的jar包)
          package junit.test;

          import java.net.URL;
          import java.util.ArrayList;
          import java.util.HashMap;
          import java.util.HashSet;
          import java.util.List;
          import java.util.Map;

          import org.dom4j.Document;
          import org.dom4j.Element;
          import org.dom4j.XPath;
          import org.dom4j.io.SAXReader;

          /**
           * 傳智傳客版容器
           *
           
          */

          public class ItcastClassPathXMLApplicationContext {
              
          private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
              
          private Map<String, Object> sigletons = new HashMap<String, Object>();
              
              
          public ItcastClassPathXMLApplicationContext(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) {
                          e.printStackTrace();
                      }

                  }

                  
              }

              
          /**
               * 讀取xml配置文件
               * 
          @param filename
               
          */

              
          private void readXML(String filename) {
                     SAXReader saxReader 
          = new SAXReader();   
                      Document document
          =null;   
                      
          try{
                       URL xmlpath 
          = this.getClass().getClassLoader().getResource(filename);
                       document 
          = saxReader.read(xmlpath);
                       Map
          <String,String> nsMap = new HashMap<String,String>();
                       nsMap.put(
          "ns","http://www.springframework.org/schema/beans");//加入命名空間
                       XPath xsub = document.createXPath("//ns:beans/ns:bean");//創建beans/bean查詢路徑
                       xsub.setNamespaceURIs(nsMap);//設置命名空間
                       List<Element> beans = xsub.selectNodes(document);//獲取文檔下所有bean節點 
                       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實例
               * 
          @param beanName
               * 
          @return
               
          */

              
          public Object getBean(String beanName){
                  
          return this.sigletons.get(beanName);
              }

          }


          新建BeanDefinition ,用來存放bean里面的兩個屬性 id 和 className。
          package junit.test;

          public class BeanDefinition {
              
          private String id;
              
          private String className;
              
              
          public BeanDefinition(String id, String className) {
                  
          this.id = id;
                  
          this.className = className;
              }

              
          public String getId() {
                  
          return id;
              }

              
          public void setId(String id) {
                  
          this.id = id;
              }

              
          public String getClassName() {
                  
          return className;
              }

              
          public void setClassName(String className) {
                  
          this.className = className;
              }

              
          }


          修改SpringTest代碼 測試程序
          package junit.test;
          import org.junit.BeforeClass;
          import org.junit.Test;
          import cn.itcast.service.PersonService;

          public class SpringTest {

              @BeforeClass
              
          public static void setUpBeforeClass() throws Exception {
              }


              @Test 
          public void instanceSpring(){
                  ItcastClassPathXMLApplicationContext ctx 
          = new ItcastClassPathXMLApplicationContext("beans.xml");
                  PersonService personService 
          = (PersonService)ctx.getBean("personService");
                  personService.save();
              }

          }


          執行測試 控制臺輸出為


          說明我們新建的傳智播客容器取到了bean實例 并成功地調用了save方法
          通過實例,我們就可以理解Spring是創建和管理bean的!

          小黑spring學習源代碼 參考源代碼
          posted on 2009-05-06 14:03 特立獨行 閱讀(450) 評論(0)  編輯  收藏 所屬分類: Spring框架
          主站蜘蛛池模板: 织金县| 九台市| 阿勒泰市| 霍城县| 资溪县| 潼南县| 玉屏| 通海县| 陆川县| 休宁县| 浦东新区| 高邑县| 宣汉县| 灵丘县| 同仁县| 华安县| 图木舒克市| 什邡市| 玉环县| 得荣县| 公主岭市| 水城县| 五常市| 浦北县| 康马县| 东乌| 和平区| 进贤县| 雷州市| 神农架林区| 陇南市| 敖汉旗| 康保县| 二连浩特市| 虹口区| 海城市| 兰州市| 三亚市| 呼玛县| 汾西县| 林芝县|