前两天写简历,写了一句:精通Spring IoC容器。怎么个精通法?还是自己动手写个IOC容器吧。
什么是IoC(Inversion of Control)?什么是DI(Dependency Injection)?不多解释,自己Google!希望你先明确几个概念,该文章不做这方面的阐述,重点关注如何实现。我将用简要的语言从需求,设计,代码三方面来描述一个简单的IoC容器,来说明IoC容器是如何帮我们创建类的实例、如何实现依赖注入,最后会奉上一个完整的IoC容器实例。
一、需求,实现一个IoC容器
1、需求描述:
2、图中一些概念:
(1)服务元数据:一种是我们的编译好的类文件,即.class文件;另一种是xml文件。你可以理解为spring的注解和xml两种配置bean的方式。
(2)服务定义信息:由元数据转换来的信息,即读取bean中的注解或xml文件,获取到的对象描述信息。
(3)服务提供者:对象的实例。你可以理解为Spring中Bean的实例;
(4)服务定义信息存储区:保存服务定义信息的地方;
(5)服务提供者实例缓存区:保存服务提供者的地方。
3、流程描述:
(1)创建容器:初始化容器,实质是初始化容器内部的工厂,然后读取元数据,转化为服务定义信息,保存到服务定义信息存储区;
(2)调用服务提供者A的方法:获取该服务提供者A的服务定义信息,判断是否有缓存,如果有,直接调用缓存中的A;如果没有,据此实例化A,放入缓存,若发现A依赖其他服务提供者B,则查找缓存,如果有,将缓存中的B注入A;否则实例化B,注入到A中,同时放入缓存。以此类推。
(3)上面两个是核心流程,在此基础上,扩展了几个流程:
1)获取所有服务提供者定义信息;
2)获取所有服务提供者实例;
3)获取某个服务提供者实例;
4)热加载新的服务提供者。
二、设计,根据需求,以面向对象为基础,融合几种设计模式来勾勒IOC容器。
注:由于源码较多,会占很大篇幅,所以只给出了部分核心代码实现,所有代码见我的CSDN CODE,见文章末尾的说明。
1、UML,类图
2、设计说明
从类图可以看出,严格按照面向接口的方式编程,松耦合的设计保证了可扩展性和灵活性。