
2.2 Spring IoC的实现方式
2.2.1 XML方式实现
用构造器方式实现IoC分为无参构造器和有参构造器两种。下面以User和Order为例说明,User使用无参构造器的方式,Order使用有参构造器的方式,分别实现无参构造器和有参构造器的IoC。
User类的实现如下:

在spring-chapter2.xml文件中,通过bean标签将User类交给IoC容器管理,代码如下:
<!-- User无参构造器 --> <bean id="user" class="com.test.ioc.constructor.User"/>
与User类不同的是,Order类是没有无参构造器的,Order类含有一个带有两个参数——订单号和订单金额的有参构造器。Order类的定义如下:

在spring-chapter2.xml文件中通过bean标签将User类交给IoC容器管理。具体配置如下:

在单元测试类XmlTest中,通过依赖注入得到Speakable的对象User和Deliverable的对象Order,单元测试代码如下:

其中@RunWith这个注解指定了让单元测试运行于Spring的环境中,@ContextConfiguration这个注解指定Spring加载的配置文件。执行单元测试,测试结果如下。
大家好 订单号201808121706,金额1000.0,已发货!
2.2.2 通过注解方式实现
除了通过构造器实现IoC,还可以通过Spring提供的注解方法实现IoC,这也是企业开发过程中最常用的一种IoC实现方式。下面通过学生类Student阐述注解的方式实现IoC。
Student类的定义如下:

注意此时的Student类上加了一个@Service注解,这告诉Spring,让其管理这个类的对象,因此开发人员就不再需要管理Student对象了。
与XML方式实现的IoC不同的是,注解方式除了配置@Service注解外,还需要指定Spring对需要管理的bean目录,否则Spring不能定位其需要管理的bean。具体配置如下:

接下来在测试类AnnotationTest中通过依赖注入,将HomeWork对象注入到AnnotationTest测试类中,测试代码如下:

运行单元测试,测试结果如下:
我是学生,我要写家庭作业
除了例中的注解@Service可以实现Bean的IoC以外,Spring还提供了很多其他的注解来实现IoC。
(1)@Component将Java类标记成一个Spring Bean组件。
(2)@Service将业务层实现类标记成一个Spring Bean组件。
(3)@Controller将控制层类标记成一个Spring Bean组件。
(4)@Repository将一个持久层实现类标记成一个Spring Bean组件。