IOC 与 AOP 属于 Spring 的核心内容,如果想把握好 Spring 你必定须要对 IOC 有足够的理解 @mikechen
IOC 的定义
IOC 是 Inversion of Control 的缩写,少数书籍翻译成“管制反转”。
IOC 不是一种技术,只是一种思维,一个重要的面向对象编程的法令,它能领导咱们如何设计出松耦合、更低劣的程序。
传统应用程序都是由咱们在类外部被动创立依赖对象,从而导致类与类之间高耦合,难于测试,有了 IoC 容器后,把创立和查找依赖对象的控制权交给了容器,如下图所示:\
上图引入了 IOC 容器,使得 A、B、C、D 这 4 个对象没有了耦合关系,齿轮之间的传动全副依附“第三方”了,全副对象的控制权全副上缴给“第三方”IOC 容器。
所以,IOC 借助于“第三方”实现具备依赖关系的对象之间的解耦,使程序更低劣。
\
IOC 与 DI 的关系
其实 IOC 包含依赖查找 (DL) 和依赖注入(DI),只不过 DL 因为有侵入性 (它须要用户本人去是应用 API 进行查找资源和组装对象),曾经被摈弃。
所以当初提到 IOC,更多的想到的就是依赖注入 (DI) 了,如图所示:\
DI 的全称是 Dependency Injection,中文称之为依赖注入,它与管制反转 (IOC) 的含意雷同,只不过这两个称说是从两个角度形容的同一个概念。
当某个 Java 对象 (调用者) 须要调用另一个 Java 对象 (被调用者,即被依赖对象) 时,在传统模式下,调用者通常会采纳“new 被调用者”的代码形式来创建对象,如图所示:\
\
这种形式会导致调用者与被调用者之间的耦合性减少,不利于前期我的项目的降级和保护。
在应用 Spring 框架之后,对象的实例不再由调用者来创立,而是由 Spring 容器来创立,Spring 容器会负责控制程序之间的关系,而不是由调用者的程序代码间接管制。
这样,控制权由利用代码转到了 Spring 容器,控制权产生了反转,这就是 Spring 的管制反转 IOC。
从 Spring 容器的角度来看,Spring 容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是 Spring 的依赖注入,如图所示:
\
依赖注入形式
Spring 的依赖注入,咱们个别应用 @Autowired 注解来实现,对于依赖注入个别有三种形式:
属性注入、结构器注入、setter 办法注入:
1. 属性注入
属性注入是大家最为常见也是应用最多的一种注入形式了,代码如下:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
//...
}
\
2.Set 注入
set 办法注入太过于臃肿,实际上很少应用:
@Service
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
@Autowired
public void setUserMapper(UserMapper userMapper) {this.userMapper = userMapper;}
}
\
3. 结构器注入
结构器注入是官网举荐的形式,如下:
@Service
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
@Autowired
public UserServiceImpl(UserMapper userMapper) {this.userMapper = userMapper;}
}
\
IOC 的优缺点
IOC 的长处
实现组件之间的解耦,进步程序的灵活性和可维护性。
IOC 的毛病
应用 IOC 框架产品可能给咱们的开发过程带来很大的益处,然而也要充分认识引入 IOC 框架的毛病,做到成竹在胸。
- 生成一个对象的步骤变简单了(其实上操作上还是挺简略的),对于不习惯这种形式的人,会感觉有些顺当和不直观。
- 对象 生成因为是应用反射编程,在效率上有些损耗,但绝对于 IoC 进步的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特地高。
\
IOC 的实现原理
IOC 容器其实就是一个大工厂,它用来治理咱们所有的对象以及依赖关系。
- 原理就是通过 Java 的反射技术来实现的,通过反射咱们能够获取类的所有信息(成员变量、类名等等等);
- 再通过配置文件 (xml) 或者注解来形容类与类之间的关系。
这样咱们就能够通过这些配置信息和反射技术来构建出对应的对象和依赖关系了,如下图所示:
IOC 容器和对象的创立过程如下:
1. 先创立 BeanFactory 容器
2. 加载配置文件,封装成 BeanDefinition
3. 调用执行 BeanFactoryPostprocessor
- 筹备工作;
- 筹备 BeanPostProcessor;
- 筹备监听器、事件、播送器;
4. 实例化
5. 初始化
6. 获取到残缺对象。
以上 \
作者简介
陈睿 |mikechen,10 年 + 大厂架构教训,《BAT 架构技术 500 期》系列文章作者,专一于互联网架构技术。
浏览 mikechen 的互联网架构更多技术文章合集
Java 并发 |JVM|MySQL|Spring|Redis| 分布式 | 高并发
关注「mikechen 的互联网架构」公众号,回复 【架构】 支付《Java 进阶架构思维导图 &Java 进阶架构文章合集》\
\
\