Spring IoC 容器是 Spring 框架中最核心的部分,也是初学者难以理解的部分,对于这种关键的设计,简单实现一次能最大限度地加深理解,了解其中思想,对以后的开发也大有裨益。
Spring IoC 容器浅析及简单实现
Spring IoC 概述
原生的 JavaEE 技术中各个模块之间的联系较强,即耦合度较高
。
比如完成一个用户的创建事务,视图层会创建业务逻辑层的对象,再在内部调用对象的方法,各个模块的独立性很差
,如果某一模块的代码发生改变,其他模块的改动也会很大。
而 Spring 框架的核心——IoC(控制反转)很好的解决了这一问题。控制反转,即某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定
,即由 Spring 容器借由 Bean 配置来进行控制。
可能 IoC 不够开门见山,理解起来较为困难。因此, Martin Fowler 提出了 DI(Dependency Injection,依赖注入)的概念来替代 IoC,即让调用类对某一接口实现类的依赖关系由第三方(容器或写协作类)注入,以移除调用类对某一接口实现类的依赖
。
比如说, 上述例子中,视图层使用业务逻辑层的接口变量,而不需要真正 new 出接口的实现,这样即使接口产生了新的实现或原有实现修改,视图层都能正常运行。
从注入方法上看,IoC 主要划分为三种类型:构造函数注入、属性注入和接口注入。在开发过程中,一般使用属性注入
的方法。
IoC 不仅可以实现类之间的解耦
,还能帮助完成类的初始化与装配工作
,让开发者从这些底层实现类的实例化、依赖关系装配等工作中解脱出出来,专注于更有意义的业务逻辑开发工作。
Spring IoC 简单实现
下面实现了一个IoC容器的核心部分,简单模拟了IoC容器的基本功能。
下面列举出核心类:
Student.java
1 | /** |
StuService.java
1 | /** |
beans.xml
1 |
|
下面是核心类 ClassPathXMLApplicationContext.java
1 |
|
最后进行测试
1 | public class MyIoCTest { |
测试成功!
1 | My name is ZYX and I'm man . |
源码
代码在我的 GitHub开源,欢迎一起交流讨论。
总结
熟悉一个框架最好的方式,就是亲手实现它。这样不仅会深刻地认识到框架的工作原理,以后的使用也会更加得心应手。
此外,在实现的过程中,又会收获很多东西,就像实现 IoC 容器一样,不仅了解解析 XML 文件的 JDOM 工具,还加深了对 Java 反射的理解。在实际开发中,几乎没有任何地方需要用到反射这一技术,但在框架实现过程中,不懂反射则寸步难行。
更多的 Spring 学习心得请戳Spring 框架学习