钻研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框架的更多相关文章

  1. 自己动手编写spring IOC源码

    前言:对于spring IOC概念不是很了解的朋友可以阅读我上一篇博客--轻松理解spring IOC(这两篇博客也是由于我的个人原因导致现在才发布,惭愧啊).通过这篇博客的理解之后,相信大家会对sp ...

  2. 从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  3. 轻松理解spring IOC

    spring IOC(Inversion of control)即控制反转 概念:一,spring框架的核心之一 二,控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 ...

  4. Spring IOC 源码简单分析 01 - BeanFactory

    ### 准备 ## 目标 了解 Spring IOC 的基础流程 ## 相关资源 Offical Doc:http://docs.spring.io/spring/docs/4.3.9.RELEASE ...

  5. 自己动手写Spring框架--IOC、MVC

    对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...

  6. [原]容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...

  7. 容器学习(一):动手模拟spring的IoC

    介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一 ...

  8. [Spring框架]Spring IOC的原理及详解。

    这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后  受益匪浅,这里再重温一遍Spring IOC ...

  9. java框架篇---spring IOC 实现原理

    IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...

随机推荐

  1. “There's no Qt version assigned to this project for platform ” - visual studio plugin for Qt

    1.find menu "Qt VS Tools", select Qt Options 2.add a new Qt version 3. right click the tar ...

  2. YTU 2456: 评委打分

    2456: 评委打分 时间限制: 1 Sec  内存限制: 128 MB 提交: 283  解决: 52 题目描述  一个歌唱比赛,比赛每次会从观众中随即抽取几名观众给分(观众至少有5个,分数为0~1 ...

  3. 一步一步学Silverlight 2系列(11):数据绑定

    概念 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  4. hive 中 Order by, Sort by ,Dristribute by,Cluster By 的作用和用法

    order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序) 只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set ...

  5. VC++编译说明

    目录 第1章编译步骤    1 第2章编译源文件    2 2.1 编译器    2 2.2 包含头文件    3 2.3 重复包含    6 2.4 预编译头文件    7 2.4.1 创建     ...

  6. Centos6.5 6.6 (均可) 重置密码或强行破解root密码 简单操作

    centos忘记root密码怎么重置root密码? 使用Linux系统的时候root密码是十分关键的安全机制. 但是假设那天丢失了root密码的话问题就严重了. 百牛信息技术bainiu.ltd整理发 ...

  7. CodeForces 718A Efim and Strange Grade (贪心)

    题意:给定一个浮点数,让你在时间 t 内,变成一个最大的数,操作只有把某个小数位进行四舍五入,每秒可进行一次. 析:贪心策略就是从小数点开始找第一个大于等于5的,然后进行四舍五入,完成后再看看是不是还 ...

  8. 51nod 1344 【前缀和】

    思路:求一下最小负数的前缀和 #include<cstdio> #include <map> #include<iostream> #include<stri ...

  9. = =写个prim希望能够巨巨们看的懂

    prim算法---典型的贪心算法 求最小生成树的算法 (Minimum Spanning Tree)最小生成树: 算法思想:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V, ...

  10. python __builtins__ help类 (32)

    32.'help', 接收对象作为参数,更详细地返回该对象的所有属性和方法 class _Helper(builtins.object) | Define the builtin 'help'. | ...