
2.3 IoC开发实现
严格来讲,IoC并不能称为是一种技术,而是一种设计思想。IoC产生的主要原因是为了限制使用关键字new,因此采用统一的容器来进行对象管理。IoC设计中,重点关注的是组件的依赖性、配置以及生命周期。通过使用IoC,能够降低组件之间的耦合度,提高类的重用性,更有利于测试,整个产品或系统也更便于集成和配置。
1.【mldnspring项目】创建一个新的子模块mldnspring-base,如图2-8所示。

图2-8 创建新的子模块
2.【mldnspring-base项目】修改pom.xml配置文件,引入Spring依赖库。

3.【mldnspring-base项目】建立IMessage接口。

4.【mldnspring-base项目】建立IMessage接口实现子类MessageImpl。

5.【mldnspring-base项目】Spring主要依赖配置文件进行Bean管理,所以需要创建一个资源目录src/main/resources,并将其提升为源代码目录,如图2-9所示。

图2-9 建立src/main/resources源代码目录
6.【mldnspring-base项目】在src/main/resources目录中创建spring/spring-base.xml配置文件。可通过STS提供的组件创建,如图2-10所示,而后选择好要保存的路径,如图2-11所示。

图2-10 创建Spring配置文件

图2-11 选择配置文件保存目录
创建Spring配置文件时,最重要的一步是要选择配置的命名空间。不同的命名空间代表着不同的配置项,由于本例只需要实现Spring的核心功能,所以这里导入beans命名空间,如图2-12所示。

图2-12 选择配置文件命名空间
7.【mldnspring-base项目】修改src/main/resources/spring/spring-base.xml配置文件,追加Bean配置项。

本程序在Spring配置文件中使用<bean>元素定义了一个被Spring管理的Java对象,该元素属性如下。
id="messageImpl":Bean的名称,Spring容器启动后可以根据此名称获取Spring管理对象。此名称不允许重复。
class="cn.mldn.mldnspring.service.impl.MessageImpl":Bean对应的完整类型,Spring容器启动时自动进行指定类对象的反射实例化处理。
8.【mldnspring-base项目】要想启用配置文件,需要先启动Spring容器,然后才可以对配置的Bean进行统一管理。编写一个程序启动类。

本程序启动了Spring容器,而后可以通过ApplicationContext接口对象,根据配置文件中定义的Bean名称获取IMessage接口子类对象实例。IMessage接口对象实例由Spring统一管理,开发者不必操心该实例化对象的管理。
提示:关于ApplicationContext接口。
ApplicationContext接口描述的是整个Spring容器。该接口有许多子类,读者可通过Spring官方网站的API文档获取相应信息。如图2-13所示列举了几个常用的ApplicantionContext子类,通过类名称可以发现,可以使用ClassPath加载,也可以使用文件加载,或者通过Web加载。

图2-13 ApplicationContext
实际开发中,用户并不需要关注ApplicationContext接口,因为Spring容器会随着Web容器自动启动。这里列出,是为了便于读者理解和学习。