自己动手实现Spring IoC框架
钻研Spring 源码也有一段时间了,对Spring IoC的实现原理理解算是比较透彻了,要实现一款IoC容器,简单的概括无非需要以下几个步骤:
1.定义用来描述bean的配置的Java类,例如我们有下面的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="person2" class="com.csii.test.pojo.Person">
</bean>
</beans>
描述该配置的Java类可以如下定义:
public class BeanDefinition {
private String id;
private String className;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
当然Spring的bean的配置要远比这个复杂,这里只是举个例子。
2.解析bean的配置,將bean的配置信息转换为上面的BeanDefinition对象保存在内存中,spring中采用HashMap进行对象存储,其中会用到一些xml解析技术,读者可以参考笔者翻译的《Java&XML教程》专栏。
3.遍历存放BeanDefinition的HashMap对象,逐条取出BeanDefinition对象,获取bean的配置信息,利用Java的反射机制实例化对象,將实例化后的对象保存在另外一个Map中即可。
大家不用怀疑,其实就是这么简单,笔者在深入学习了Spring的源码后,自己动手写了一款Mini版的Spring。
下面是mini spring 的功能演示:
定义bean的配置文件beans.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 测试注入字面量 -->
<bean id="person1" class="com.csii.test.pojo.Person">
<property name="name" value="Jack"/>
</bean>
<bean id="person2" class="com.csii.test.pojo.Person">
<property name="name" value="Jane"/>
</bean>
<!-- 测试注入引用类型 -->
<bean id="company" class="com.csii.test.pojo.Company">
<property name="person" ref="person1"/>
</bean>
</beans>
新建测试用例ClassPathXmlApplicationContextTest.java内容如下:
package com.csii.minispring.context;
import org.junit.Test;
import com.csii.test.pojo.Company;
import com.csii.test.pojo.Person;
public class ClassPathXmlApplicationContextTest {
@Test
public void testStartIoc() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml");
Person person1 = (Person) context.getBean("person1");
System.out.println(person1.getName());
Person person2 = (Person) context.getBean("person2");
System.out.println(person2.getName());
Company company = (Company) context.getBean("company");
System.out.println(company.getPerson().getName());
}
}
笔者采用JUnit作为单元测试工具,运行testStartIoc测试方法,程序运行正常,控制台输出:
Jack
Jane
Jack
下图是mini spring框架的工程结构图,源码已托管至github,希望对大家能有参考价值。
源码地址:https://github.com/rongbo-j/mini-spring-v1.0
下面对源代码进行简单的说明:
该工作空间用到的所有jar包都存放在mini-spring-libs工程下。
mini-spring-v1.0工程为mini spring的源码,分为三个源码包,resource、java、test;resource源码包下存放所有资源文件,test源码包存放测试用例,java源码包下为核心源代码。
该开源项目会长期维护,感兴趣的朋友在github上fork一下源码即可。
自己动手实现Spring IoC框架的更多相关文章
- 自己动手编写spring IOC源码
前言:对于spring IOC概念不是很了解的朋友可以阅读我上一篇博客--轻松理解spring IOC(这两篇博客也是由于我的个人原因导致现在才发布,惭愧啊).通过这篇博客的理解之后,相信大家会对sp ...
- 从零开始手写 spring ioc 框架,深入学习 spring 源码
IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...
- 轻松理解spring IOC
spring IOC(Inversion of control)即控制反转 概念:一,spring框架的核心之一 二,控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 ...
- Spring IOC 源码简单分析 01 - BeanFactory
### 准备 ## 目标 了解 Spring IOC 的基础流程 ## 相关资源 Offical Doc:http://docs.spring.io/spring/docs/4.3.9.RELEASE ...
- 自己动手写Spring框架--IOC、MVC
对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...
- [原]容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...
- 容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一 ...
- [Spring框架]Spring IOC的原理及详解。
这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后 受益匪浅,这里再重温一遍Spring IOC ...
- java框架篇---spring IOC 实现原理
IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...
随机推荐
- 【转】Java数字抽奖游戏核心代码
1. [代码][Java]代码 package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个 ...
- poj 3368 Frequent values 解题报告
题目链接:http://poj.org/problem?id=3368 题目意思:给出一段 n 个数的序列你,对于区间 [l, r] 的询问,找出 出现频率最高的数的次数.考虑到序列中的数是非递减的, ...
- 在msys里进行复制和粘贴操作
You can copy text from an MSYS window to the clipboard simply by selecting the text you want to copy ...
- Socket教程
Socket网络编程学习笔记(6):使用线程池提高性能 Socket网络编程学习笔记(5):发送和接收实体类数据 Socket网络编程学习笔记(4):TCP消息边界处理 Socket网络 ...
- 如何 Xcode 开发工具里安装一个空的项目末模板
很多朋友因为Xcode升级取消了空工程模板而发愁 今天给大家推荐一个简单方便的方法,导入空工程模板 对于 xcode7 来说可以使用下面的方法添加空模板.建议在升级的时候,不要下载beta版,最好下 ...
- Oracle的db.properties文件
转自:https://blog.csdn.net/lssqk/article/details/79133829
- JAVA基础--异常10
一.Object类简介 1.Object类简介 Object,是Java一切对象的最高父类:如果一个类没有显示继承一个类,他的父类就是Object: 它描述的是Java世界里所有对象最最共性的信息,它 ...
- bzoj 4550: 小奇的博弈【博弈论+dp】
首先看出终止状态是全都堆在左边或者右边,然后发现黑的向左白的向右是最优策略(如果不能这样了也就该输了) 然后就不会了 参考 http://www.cnblogs.com/CQzhangyu/p/770 ...
- CF767E ChangeFree【贪心/优先队列】By cellur925
题目传送门 $naive$想法 最开始的一个贪心策略是每次尽量花掉硬币 ,如果不满足条件,就花纸币.而且不满足条件的时候,要尽量向百取整.(显然是不对的,因为有时候不够)但是显然这个贪心策略是错误的, ...
- MySQL varchar 最大长度,text 类型占用空间剖析
MySQL 表中行的最大大小为 65,534(实际行存储从第二个字节开始)字节.每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节. 那么来验证下 varchar 类型的实际最大长度: 测 ...