![Spring 5企业级开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/807/26542807/b_26542807.jpg)
2.2 Spring IoC的实现方式
2.2.1 XML方式实现
用构造器方式实现IoC分为无参构造器和有参构造器两种。下面以User和Order为例说明,User使用无参构造器的方式,Order使用有参构造器的方式,分别实现无参构造器和有参构造器的IoC。
User类的实现如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P33_94524.jpg?sign=1738890019-8fkjLSaC1vlgL3foutegQFePmd4lfkNJ-0-c0d53586b7ae6ff829cef613a18f40b8)
在spring-chapter2.xml文件中,通过bean标签将User类交给IoC容器管理,代码如下:
<!-- User无参构造器 --> <bean id="user" class="com.test.ioc.constructor.User"/>
与User类不同的是,Order类是没有无参构造器的,Order类含有一个带有两个参数——订单号和订单金额的有参构造器。Order类的定义如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P33_94525.jpg?sign=1738890019-M41AxNofXZdNANcFNzsWssd2DczVUfJ8-0-c7b7b06a25a3a97a92382827d2134aa2)
在spring-chapter2.xml文件中通过bean标签将User类交给IoC容器管理。具体配置如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P34_94527.jpg?sign=1738890019-DlK1QI8BjoPzwvfbX9XxevxKBw25i6hr-0-5c952c9d97b174adef7d797ff0909945)
在单元测试类XmlTest中,通过依赖注入得到Speakable的对象User和Deliverable的对象Order,单元测试代码如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P34_94528.jpg?sign=1738890019-aYHKB5dQ7GyFmiWkrDm5A8bPWVipztA6-0-70446a5c4399a492918e2c065c8fa565)
其中@RunWith这个注解指定了让单元测试运行于Spring的环境中,@ContextConfiguration这个注解指定Spring加载的配置文件。执行单元测试,测试结果如下。
大家好 订单号201808121706,金额1000.0,已发货!
2.2.2 通过注解方式实现
除了通过构造器实现IoC,还可以通过Spring提供的注解方法实现IoC,这也是企业开发过程中最常用的一种IoC实现方式。下面通过学生类Student阐述注解的方式实现IoC。
Student类的定义如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P35_94529.jpg?sign=1738890019-UyblBJKyR5u2nTXNKjUVn8IamJ7PON2g-0-8836e589cc83a3383b9c1268a5e4ec1a)
注意此时的Student类上加了一个@Service注解,这告诉Spring,让其管理这个类的对象,因此开发人员就不再需要管理Student对象了。
与XML方式实现的IoC不同的是,注解方式除了配置@Service注解外,还需要指定Spring对需要管理的bean目录,否则Spring不能定位其需要管理的bean。具体配置如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P35_94530.jpg?sign=1738890019-WET7w0pAt3pTgjrQYAinoGreV7aVhAQz-0-6da909f762fa2bab0310e398b2d9b50b)
接下来在测试类AnnotationTest中通过依赖注入,将HomeWork对象注入到AnnotationTest测试类中,测试代码如下:
![](https://epubservercos.yuewen.com/45D01C/15056703904176006/epubprivate/OEBPS/Images/Figure-P35_94531.jpg?sign=1738890019-KpjPFdJ93F47svBE3YHkh41r0sJRvSvM-0-7654c2e44f05b492641fd3b9ee8f9d02)
运行单元测试,测试结果如下:
我是学生,我要写家庭作业
除了例中的注解@Service可以实现Bean的IoC以外,Spring还提供了很多其他的注解来实现IoC。
(1)@Component将Java类标记成一个Spring Bean组件。
(2)@Service将业务层实现类标记成一个Spring Bean组件。
(3)@Controller将控制层类标记成一个Spring Bean组件。
(4)@Repository将一个持久层实现类标记成一个Spring Bean组件。