博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理
阅读量:7067 次
发布时间:2019-06-28

本文共 2577 字,大约阅读时间需要 8 分钟。

spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了。那么它的原理是什么呢?是怎么实现的呢?下面我来简单的模拟一下spring的机制,相信看完之后就会对spring的原理有一定的了解。

  spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。

  首先我们建立一个BeanFactory接口

1 package com.spring;2 3 public interface BeanFactory {4     Object getBean(String id);5 }

  然后建立一个BeanFactory的实现类ClassPathXmlApplicationContext.java

1 package com.spring; 2  3 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 6  7 import org.dom4j.Document; 8 import org.dom4j.DocumentException; 9 import org.dom4j.Element;10 import org.dom4j.io.SAXReader;11 12 13 public class ClassPathXmlApplicationContext implements BeanFactory {14     private Map
beans = new HashMap
();15 public ClassPathXmlApplicationContext(String fileName) throws Exception{16 SAXReader reader = new SAXReader();17 Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(fileName));18 List
elements = document.selectNodes("/beans/bean");19 for (Element e : elements) {20 String id = e.attributeValue("id");21 String value = e.attributeValue("class");22 Object o = Class.forName(value).newInstance();23 beans.put(id, o);24 }25 }26 27 public Object getBean(String id) {28 return beans.get(id);29 }30 31 }

  然后配置applicationContext.xml

1 
2
3
4
5

创建类的时候顺便演示一下工厂模式,其实BeanFactory它也是一种工厂模式的。

1 package com.spring;2 3 public interface Moveable {4     void run();5 }
1 package com.spring;2 3 public class Car implements Moveable{4     5     public void run(){6         System.out.println("拖着四个轮子满街跑car·····");7     }8 }
1 package com.spring;2 3 public class Plane implements Moveable{4 5     public void run() {6         System.out.println("拖着翅膀天空飞plane......");7     }8     9 }

 

现在来看一看效果吧,写一个类测试一下:

1 package com.spring; 2  3 import org.dom4j.DocumentException; 4  5 public class Test { 6  7     /** 8      * @param args 9      * @throws DocumentException 10      */11     public static void main(String[] args) throws Exception {12         BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");13         Object o = factory.getBean("c");14         Moveable m = (Moveable)o;15         m.run();16     }17 18 }

由于Map容器里面保存的是Object类型,所以通过getBean()方法取出来的对象要强制类型转换。

转载地址:http://gxall.baihongyu.com/

你可能感兴趣的文章
firefox各版本下载地址
查看>>
Dubbo之ProxyFactory
查看>>
Spring之getBean
查看>>
远程访问服务 (RAS) 错误代码列表
查看>>
java.util.concurrent.atomic与CAS详解
查看>>
天猫魔盒 华数盒子双清
查看>>
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 的说明
查看>>
用模板实现 seqlist
查看>>
Mac go delve debug
查看>>
人人都能开发物联网
查看>>
分享一个超棒的免费jQuery幻灯插件:Nivo Slider
查看>>
Linux常用命令以及快捷键
查看>>
分享一个帮助你在线测试响应式设计的web工具 - Screenqueri.es
查看>>
nginx和php互动过程;
查看>>
Android 代码混淆(progruard)
查看>>
SylixOS 中断响应时间测试
查看>>
本地存储(localStorage、usedate)
查看>>
linux学习笔记——搭建基于nginx的web服务器、多核配置、nginx配置参数
查看>>
启动时若没有用户代码则发出警告
查看>>
C语言运算符优先级等级口诀
查看>>