Spring学习笔记--- BeanFactory简单模拟

Spring中频繁使用了工厂模式,相对于一般的工厂模式做了优化,所以这里简单的模拟下,作为学习档案。

 

外部引用的jar包下载:http://www.jdom.org

Jdom参考文章:http://www.ibm.com/developerworks/cn/xml/x-jdom/

工厂模式一般有三种:

       工厂模式在《Java与模式》中分为三类:

       1)简单工厂模式(Simple Factory

2)工厂方法模式(Factory Method

3)抽象工厂模式(Abstract Factory

介绍三类的好文章很多,google就好了。

区别:(这里工厂产生的类称为产品)

简单工厂模式:用来生产同一等级结构中的任意产品。对与增加新的产品,无能为力。

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)  

抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

说白了,工厂方法虽然可以很好扩展产品种类,但是每次增加产品就要添加一个工厂,会导致工厂泛滥的情况,而抽象工厂模式每次可以生产一系列的产品,但是产品扩展方面局限性又大,spring中的工厂模式采用配置文件的方式很好的解决了他们的短板。

文件清单:BeanFactory.java:工厂接口类

          BuildPathXMLApplicationContext.java:文件解析的实现

Movable.java:交通工具接口

Car.java:交工工具实现

Plane.java:交工工具实现

Test.java:测试类

applicationContext.xml:配置文件

文件清单一:BeanFactory.java

 

  
  
  
  
  1. package com.lzz.myspringIOC; 
  2. /** 
  3.  *  定义工厂接口 
  4.  * @author Administrator 
  5.  * 
  6.  */ 
  7. public interface BeanFactory { 
  8.     public Object getBean(String beanName); 

文件清单二:BuildPathXMLApplicationContext.java

 

  
  
  
  
  1. package com.lzz.myspringIOC; 
  2.  
  3. import java.util.HashMap; 
  4. import java.util.List; 
  5. import java.util.Map; 
  6.  
  7. import org.jdom2.Document; 
  8. import org.jdom2.Element; 
  9. import org.jdom2.input.SAXBuilder; 
  10. import org.jdom2.xpath.XPath; 
  11.  
  12. /** 
  13.  * 读取配置文件的bean,并生成实例对象,放在一个map中等待调用 
  14.  * @author Administrator 
  15.  * 
  16.  */ 
  17. public class BuildPathXMLApplicationContext implements BeanFactory { 
  18.     private Map<String, Object> container=new HashMap<String, Object>(); 
  19.     public BuildPathXMLApplicationContext(String fileName) throws Exception{ 
  20.         //通过xml的解析得到bean的id和class名称,并创建实例,存储到msp中 
  21.         SAXBuilder sb = new SAXBuilder(); 
  22.           Document doc = sb.build( 
  23.                   BuildPathXMLApplicationContext.class.getClassLoader().getResourceAsStream(fileName)); 
  24.           Element root = doc.getRootElement(); 
  25. System.out.println(root); 
  26.           List list = XPath.selectNodes(root, "/beans/bean"); 
  27. System.out.println(list.size()); 
  28.           for(int i=0;i<list.size();i++){ 
  29.               Element beans = (Element) list.get(i); 
  30.               String id = beans.getAttributeValue("id"); 
  31.               String clazzName=beans.getAttributeValue("class"); 
  32. System.out.println(id+"   "+clazzName); 
  33.               container.put(id, Class.forName(clazzName).newInstance()); 
  34.           } 
  35.  
  36.          
  37.     } 
  38.     public Object getBean(String beanName){ 
  39.         return container.get(beanName); 
  40.     } 

文件清单三:Movable.java

 

  
  
  
  
  1. package com.lzz.myspringIOC; 
  2. /** 
  3.  * 所有交通工具要实现的类 
  4.  * @author lzz 
  5.  * 
  6.  */ 
  7. public interface Movable { 
  8.     public void run(); 

文件清单四:Car.java

 

  
  
  
  
  1. package com.lzz.myspringIOC; 
  2.  
  3. public class Car implements Movable{ 
  4.     public void run(){ 
  5.         System.out.println("小汽车。。。嘀嘀嘀"); 
  6.     } 

文件清单五:Plane.java

 

  
  
  
  
  1. package com.lzz.myspringIOC; 
  2.  
  3. public class Plane implements Movable { 
  4.  
  5.     public void run() { 
  6.         System.out.println("plane......."); 
  7.     } 

文件清单六:Test.java

 

  
  
  
  
  1. package com.lzz.myspringIOC; 
  2. /** 
  3.  *  添加新的"产品"的时候,只要修改配置文件就可以使用了 
  4.  *  解决了工厂方法的不能生产系列"产品"的问题 
  5.  *  又解决了抽象工厂方法中不能添加"新产品"的问题 
  6.  * @author lzz 
  7.  * 
  8.  */ 
  9. public class Test { 
  10.     public static void main(String[] args) throws Exception { 
  11.         BeanFactory bf=new BuildPathXMLApplicationContext("com/lzz/myspringIOC/applicationContext.xml"); 
  12.                                     //配置文件的CLASSPATH下的路径 
  13.         Object o=bf.getBean("v");  //配置文件中bean的id属性,是car还是plane只要修改配置文件就好了 
  14.         Movable m=(Movable)o;  //这里使用接口实现多态,当配置文件更改的时候,就不需要更改了 
  15.         m.run(); 
  16.     } 

文件清单七:applicationContext.xml

 

  
  
  
  
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans> 
  3.     <bean id="v" class="com.lzz.myspringIOC.Plane"
  4. </bean> 
  5. </beans> 

 测试结果:

 

  
  
  
  
  1. [Element: <beans/>] 
  2. 1 
  3. v   com.lzz.myspringIOC.Plane 
  4. plane....... 

 

你可能感兴趣的:(java,spring,IOC,beanfactory)