Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理
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<String, Object> beans = new HashMap<String, Object>();
15 public ClassPathXmlApplicationContext(String fileName) throws Exception{
16 SAXReader reader = new SAXReader();
17 Document document = reader.read(this.getClass().getClassLoader().getResourceAsStream(fileName));
18 List<Element> 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 <?xml version="1.0" encoding="UTF-8"?>
2 <beans>
3 <bean id="c" class="com.spring.Car"></bean>
4 <bean id="p" class="com.spring.Plane"></bean>
5 </beans>
创建类的时候顺便演示一下工厂模式,其实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()方法取出来的对象要强制类型转换。
Spring源码学习之:模拟实现BeanFactory,从而说明IOC容器的大致原理的更多相关文章
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
- Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...
- Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...
- Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件
写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设 ...
- Spring 源码学习——Aop
Spring 源码学习--Aop 什么是 AOP 以下是百度百科的解释:AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程通过预编译的方式和运行期动态代理实 ...
- spring源码学习之路---深入AOP(终)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...
- spring源码学习之路---IOC初探(二)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
前言 在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程. 入口 从 ...
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
随机推荐
- ajax上传组件
BJUI框架的异步上传组件功能. 初始化: 1.Data属性:div添加属性data-toggle="upload"后可触发上传组件. 示例代码: <div class=&q ...
- iOS中类方法的作用
类方法,这意味着你将它发送给类,而不是对象实例. 因为不是发送给一个实例,所以你不能使用任何实例变量,你只能做一些通用性的事情. 实际上类方法只用于两种情况: 1.创建事物,比如创建一个特殊格式的字符 ...
- ODI中web service介绍
ODI WS架构
- Jquery中的prop()方法 全选或全不选
注意: prop()在高版本才会有效, 低版本用attr(); $(function(){ // 元素checkbox var aChecked = $('.checkGoods'); // 全选 v ...
- SVG 2D入门5 - 颜色的表示
SVG和canvas中是一样的,都是使用标准的HTML/CSS中的颜色表示方法,这些颜色都可以用于fill和stroke属性.基本有下面这些定义颜色的方式:1. 颜色名字: 直接使用颜色名字red, ...
- C/C++ 字符串 null terminal
在C/C++中,字符串以'\0'结尾是一种强制要求,或者说,只有满足这个要求的 字符数组才能被称为字符串.否则,你所做的所有操作结果都是未定义的! C标准库string.h中所有关于字符串的函数都有一 ...
- Configuration for Python to run on Android
It's exiting to learn to make app on Android with python. But when I check <Head First Python> ...
- 极客DIY:如何构建一台属于自己的基站
写在前面(原文作者) 上周我去特拉维夫(Tel Aviv)探望我的朋友结果有了一些收获,一块崭新的BladeRF(x40),即一个支持USB3.0的SDR平台,这就意味着可以同时发送和接收信息了.而H ...
- 深入学习:如何实现不同Android设备之间相同应用程序的网络服务发现功能
在我们的app中添加网络服务发现功能(NSD)以方便在不同的设备上响应局域网中的请求.这种功能对于多设备之间点对点服务来说很有用,例如多人游戏,多人通话,文件共享等. 一,在网络中注册你的服务 注意: ...
- 看了这篇文章,Java编程速度我都惊呆了
熟记于心,打遍天下,(开始装了) 保存 Ctrl+s (这个就不用解释了吧!!!!) 注释代码 Ctrl+/ 取消注释 Ctrl+/代码辅助 Alt+/ 快速修复 ...