zoukankan      html  css  js  c++  java
  • 理解Spring的Bean工厂

       一提到工厂,我们先来回顾前面学习过的工厂方法和抽象工厂模式:


       厂方法:针对产品维度,能够产生新的产品,也能够产生新的产品工厂,既能够扩展产品维度。可是假设我们想在普通工厂上生产产品系列,就会特别麻烦假设产生Apple你就得产生AppleFactory,假设产生Mushroom,就得产生MushroomFactory.这样就会照成工厂泛滥。


       抽象工厂:针对产品系列,能够在谋一系列的产品上进行扩展。缺点是假设产生产品新种,修改就会非常多。 

      

       Spring工厂:能够在产品系列方面既能扩展,又能确定产品品种。以下是Spring的实例:


       1.首先定义一个接口两个类:

    public class Car implements Moveable {	
    	public void run(){
    		System.out.println("O(∩_∩)O哈哈~,开着敞篷车回家咯~~~~~");
    	}
    }

    public class Train implements Moveable {
    	@Override
    	public void run() {
    		System.out.println("呜呜呜~~,仅仅能挤火车 ~~~");		
    	}
    }
    public interface Moveable {
    	void run();
    }
    

       2.加入引用Spring的Jar包 ,加入XML文件:applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans>
    <bean id="v" class="com.tgbstd.spring.factory.Car"></bean>
    </beans>


       3.測试类:

    	public static void main(String[] args) throws Exception {
    		BeanFactory f = new ClassPathXmlApplicationContext("applicationContext.xml");	
    		Object o =f.getBean("v");  //传入id
    		Moveable m =(Moveable)o; 
    		m.run();
    	}
    }

       Spring利用本身读取XML配置文件,而且实现了BeanFactory接口。我们仅仅须要在client传入配置文件名称,传入配置文件的ID,就能依据Id找到对应的class产生的对象,并将对象作为一个bean反馈回来。 

       上面是封装好的一个Spring,那么我们怎样来模拟Spring的原理呢?

       Spring模拟:定义一个BeanFactory,在这个里面有自己的实现,最常见的实现ClassPathXML ,从这里面读XML,把读到的信息都装在一个MAP里面,当你要的时候再拿出来。


       A.定义BeanFactory接口和getBean方法 

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


       B.定义自己的实现:创建读取XML文件类,ClassPathXmlApplicationContext。前面一篇文章已经介绍了怎样读取XML文件,这里就不再赘述,直接看实例吧。 

    public class ClassPathXmlApplicationContext implements BeanFactory {
    	
    	//把全部配置文件中的东西读出来保存在map里面
    	private Map<String,Object> container = new HashMap<String,Object>();
    	
    	//定义构造函数
    	public ClassPathXmlApplicationContext(String fileName) throws Exception {
    		
    		SAXBuilder sb = new SAXBuilder();
    		Document doc = sb.build(this.getClass().getClassLoader()
    				.getResourceAsStream(fileName));   //拿到配置文件
    		Element root = doc.getRootElement();
    		List list = XPath.selectNodes(root, "/beans/bean");   
    		
    		// 循环遍历节点
    		for (int i = 0; i < list.size(); i++) {
    			Element bean = (Element) list.get(i);
    			String id = bean.getAttributeValue("id");
    			String clazz = bean.getAttributeValue("class");
    			Object o =Class.forName(clazz).newInstance();
    			
    			container.put(id, o); //存放对象
    			
    			//相关过程输出
    			System.out.println("id=" + id);
    			System.out.println("通过id拿到详细的class信息:" +"class");
    			
    		}
    	}
    
    	@Override
    	//调用getBean将拿到的信息返回给客户
    	public Object getBean(String id) {
    		return container.get(id);		
    		
    	}
    
    }

       在ClassPathXmlApplicationContext类的构造方法中,有一个文件名称,通过fileName指向配置文件,就能从配置文件读取信息了。而且把全部从配置文件读出来的信息,存储在map容器里。

       C.測试类

    public class Test {
    	public static void main(String[] args) throws Exception {
    		//父类引用指向子类对象,找到配置文件
    		BeanFactory f = new ClassPathXmlApplicationContext("com/tgbstd/spring/factory/applicationContext.xml");
    		//传入id
    		Object o = f.getBean("v");
    		Moveable m =(Moveable)o; 
    		m.run();   		
    	}
    }
    

       D.结果:

       上面简单的介绍了Spring创建Bean工厂的原理。事实上Bean主要是通过自定义一个BeanFactory工厂的实现,通过构造函数传入初始值,读取XML配置文件信息。而且将读取到的id作为key值,读取到的对象作为Value值,存入到Map容器中。当client须要获取时,仅仅要传入id,就能从容器中读取出来。    

       

       百度百科定义:Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。而Bean工厂的概念是Spring作为IOC(面向接口或面向抽象类编程,将详细的东西写在配置文件中。当我们需求改变时,仅仅须要去改动配置文件,比如,将Car改动为Train。我们得到的结果就是做火车回家的方式。)容器的基础。可想而知,理解Bean工厂的原理是很有必要的。 

       

  • 相关阅读:
    Sql server 2005 restore failed
    使用Windows Live Writer发布到cnblogs
    IE7 Tab problem
    转: 编码,charset,乱码,unicode,utf8与net简单释义(续)
    移动12.1号动感地带寻宝答案
    转: 各种 lightbox 实现
    Cannot connect windows 2003 server remotely by mstsc
    boost asio 网络编程案例简单改写
    读书笔记之《程序员的自我修养链接、装载与库》
    基于OpenSSL简单实现Shamir基于身份的数字签名算法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4326881.html
Copyright © 2011-2022 走看看