Spring的bean的存儲和管理機制


      在tomcat容器加載時會將所有單例的bean實例化並且加入到HashMap中。在之后需要單例bean之時直接從hashmap中取。如果hashmap中沒有則從spring容器中實例化並且將其放入haspmap,而非單例bean是不會被放入hashmap中只會從spring容器中加載。以下是模擬這種機制的代碼

定義beanDefinition

 1 public class beanDefinition {  
 2   
 3     private String id;  
 4   
 5     private String className;  
 6   
 7 
 8     public beanDefinition(String id, String className) {  
 9         this.id = id;  
10         this.className = className;  
11   
12     }
13 
14      public String getId() {  
15         return id;  
16     }
17 
18     public void setId(String id) {  
19   
20         this.id = id;  
21   
22     }  
23   
24   
25     public String getClassName() {  
26   
27         return className;  
28   
29     }  
30   
31    
32 
33     public void setClassName(String className) {  
34   
35         this.className = className;  
36   
37     }  
38   
39    
40   
41 }    
42   
 
         

自定義IoC容器WxyClassPathXMLApplicationContext ,該容器實現三個功能:

 
         

 (1) BeanDefinition的resource定位:readXML();

 
         

 (2) BeanDefinition的載入和解析 :readXML();

 
         

 (3) BeanDefinition在IoC容器中的注冊 instanceBeans();

 
         

import
java.net.URL; import java.util.ArrayList; import java.util.HashMap; 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; import com.wxy.bean.BeanDefinition; public class ClassPathXMLApplicationContext { //存放BeanDefinition的列表,在beans.xml中定義的bean不止一個 private final List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>(); //將類名作為索引,將創建的Bean對象存入到Map中 private final Map<String, Object> sigletons = new HashMap<String, Object>(); public ClassPathXMLApplicationContext(String fileName) { //讀取xml配置文件 this.readXML(fileName); //實例化bean this.instanceBeans(); } /** * 讀取XML配置文件,獲取BeanDefinition內容,存入到beanDefinition列表中 * @param fileName xml配置文件名稱 */ private void readXML(String fileName) { SAXReader saxReader = new SAXReader(); Document document = null; try { //通過類加載器獲取Resource資源路徑,實現BeanDefinition的resource定位 URL xmlPath = this.getClass().getClassLoader().getResource(fileName); //將xml讀入到document中 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"); //設置命名空間 xsub.setNamespaceURIs(nsMap); //獲取文檔下的所有Bean節點 List<Element> beans = xsub.selectNodes(document); for (Element element : beans) { //獲取id屬性值 String id = element.attributeValue("id"); //獲取class屬性值 String clazz = element.attributeValue("class"); BeanDefinition beanDefinition = new BeanDefinition(id, clazz); //將新創建的BeanDefinition賭俠ing放入到BeanDeifnitions中 beanDefinitions.add(beanDefinition); } } catch (Exception e) { System.out.println(e.toString()); } } /** * 實例化bean,存入到sigletons中 */ private void instanceBeans() { for (BeanDefinition beanDefinition : beanDefinitions) { try { if (beanDefinition.getClassName() != null && !(beanDefinition.getClassName().isEmpty())) { //利用java反射機制,生成BeanDefinition實例,並將其注冊到sigletons中 sigletons.put(beanDefinition.getId(), Class.forName( beanDefinition.getClassName()).newInstance()); } } catch (Exception e) { e.printStackTrace(); } } } /** * 根據ID名獲取實例bean * return 返回一個Object對象,用戶使用時,需要對獲取的結果進行轉換類型 */ public Object getBean(String beanName) { return this.sigletons.get(beanName); } }
 1 public class Test {  
 2   
 3    
 4   
 5     public static void main(String[] args) {  
 6   
 7         //IOC容器實例化  
 8   
 9        ClassPathXMLApplicationContext ctx = new WxyClassPathXMLApplicationContext("beans.xml");  
10   
11         //獲取業務bean  
12   
13         PeopleServiceBean peopleService = (PeopleServiceBean) ctx.getBean("peopleService");  
14   
15         peopleService.save();  
16   
17     }  
18   
19    
20   
21 }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM