spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了。那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后就会对spring的原理有一定的了解。
spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。
首先我们建立一个BeanFactory接口
1packagecom.spring; 2 3publicinterfaceBeanFactory{ 4ObjectgetBean(Stringid); 5}然后建立一个BeanFactory的实现类ClassPathXmlApplicationContext.java
1packagecom.spring; 2 3importjava.util.HashMap; 4importjava.util.List; 5importjava.util.Map; 6 7importorg.dom4j.Document; 8importorg.dom4j.DocumentException; 9importorg.dom4j.Element; 10importorg.dom4j.io.SAXReader; 11 12 13publicclassClassPathXmlApplicationContextimplementsBeanFactory{ 14privateMap<String,Object>beans=newHashMap<String,Object>(); 15publicClassPathXmlApplicationContext(StringfileName)throwsException{ 16SAXReaderreader=newSAXReader(); 17Documentdocument=reader.read(this.getClass().getClassLoader().getResourceAsStream(fileName)); 18List<Element>elements=document.selectNodes("/beans/bean"); 19for(Elemente:elements){ 20Stringid=e.attributeValue("id"); 21Stringvalue=e.attributeValue("class"); 22Objecto=Class.forName(value).newInstance(); 23beans.put(id,o); 24} 25} 26 27publicObjectgetBean(Stringid){ 28returnbeans.get(id); 29} 30 31}然后配置applicationContext.xml
1<?xmlversion="1.0"encoding="UTF-8"?> 2<beans> 3<beanid="c"class="com.spring.Car"></bean> 4<beanid="p"class="com.spring.Plane"></bean> 5</beans>创建类的时候顺便演示一下工厂模式,其实BeanFactory它也是一种工厂模式的。
1packagecom.spring; 2 3publicinterfaceMoveable{ 4voidrun(); 5} 1packagecom.spring; 2 3publicclassCarimplementsMoveable{ 4 5publicvoidrun(){ 6System.out.println("拖着四个轮子满街跑car·····"); 7} 8} 1packagecom.spring; 2 3publicclassPlaneimplementsMoveable{ 4 5publicvoidrun(){ 6System.out.println("拖着翅膀天空飞plane......"); 7} 8 9}现在来看一看效果吧,写一个类测试一下:
1packagecom.spring; 2 3importorg.dom4j.DocumentException; 4 5publicclassTest{ 6 7/** 8*@paramargs 9*@throwsDocumentException 10*/ 11publicstaticvoidmain(String[]args)throwsException{ 12BeanFactoryfactory=newClassPathXmlApplicationContext("applicationContext.xml"); 13Objecto=factory.getBean("c"); 14Moveablem=(Moveable)o; 15m.run(); 16} 17 18}由于Map容器里面保存的是Object类型,所以通过getBean()方法取出来的对象要强制类型转换。
本文内容总结:
原文链接:https://www.cnblogs.com/liuling/archive/2013/04/14/BeanFactory.html