1. 概述
控制反转(IoC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。
IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式有两种: 依赖注入和依赖查找。依赖注入方式应用更为广泛。
- 依赖查找:Dependency Lookup,DL,容器提供回调接口和上下文环境给组件,程序代码则需要提供具体的查找方式。比较典型的是依赖于 JNDI 系统的查找。
依赖注入 Dependency Injection,DI,程序代码不做定位查询,这些工作由容器自行完成。
- 依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持 POJO 之间依赖关系的管理。
依赖注入是目前最优秀的解耦方式。依赖注入让 Spring 的 Bean 之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起的。
2. 第一个 Spring 应用程序
2.1 POM
创建一个工程名为 hello-spring 的项目,pom.xml 文件如下:
1 | <?xml version="1.0" encoding="UTF-8"?> |
主要增加了 org.springframework:spring-context 依赖
2.2 创建接口与实现
2.2.1 创建 UserService 接口
1 | package com.zysheep.hello.spring.service; |
2.2.2 创建 UserServiceImpl 实现
1 | package com.zysheep.hello.spring.service.impl; |
2.3 创建 Spring 配置文件
在 src/main/resources 目录下创建 spring-context.xml 配置文件,从现在开始类的实例化工作交给 Spring 容器管理(IoC),配置文件如下:
1 | <?xml version="1.0" encoding="UTF-8"?> |
:用于定义一个实例对象。一个实例对应一个 bean 元素。 - id:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,Bean 与 Bean 间的依赖关系也是通过 id 属性关联的。
- class:指定该 Bean 所属的类,注意这里只能是类,不能是接口
2.4 测试 Spring IoC
创建一个 MyTest 测试类,测试对象是否能够通过 Spring 来创建,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.zysheep.hello.spring;
import com.zysheep.hello.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
// 获取 Spring 容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
// 从 Spring 容器中获取对象
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sayHi();
}
}