Spring系列 | IOC 知多少
今天的主要内容是IOC ,重点聚焦两个问题,一个是IOC 是什么,另一个是IOC在spring中是怎么体现和应用的。
用不太严谨但好懂的大白话来说,IOC就是把原来由应用程序自己来主动创建查找 管理对象的那部分,交给了框架处理。只要你告诉框架,你是那个对象,你需要哪个对象就可以了。不用在自己去找这个对象在哪里,也不用管怎么去找到并创建和销毁这个对象了。
IOC是什么
从定义和主要实现策略两个维度来展开
定义
IOC 在*上的定义是这样写的
In software engineering, inversion of control (IoC) is a programming principle.
IOC 是 inversion of control 的缩写,即控制反转。它是一种编程的原则或风格。
说起IOC的简史,它最早是1983年,Richard E.Sweet 在《TheMesaProgrammingEnvironment》中提出的 “Hollywood Principle” ,即 “好莱坞原则”,主要表达的意思也是大家很熟悉的一句话“不要来打电话给我,我会打电话给你” ,也就是导演 在会去联系演员,导演会打电话给演员,而不是演员主动联系导演。这里面其实就是控制反转的原则,在程序里对应则是:我们的依赖 或是我们的数据是由其他方来提供的,而非自己去读取的。
实现策略
在*中 Inversion_of_control 有这样的定义:
In object-oriented programming, there are several basic techniques to implement inversion of control. These are:
• Using a service locator pattern (注:服务定位模式)
• Using dependency injection (注:依赖注入), for example
• Constructor injection (注:构造器注入)
• Parameter injection (注:参数注入)
• Setter injection (注:setter注入)
• Interface injection (注:接口注入)
• Using a contextualized lookup (注:上下文的依赖查询 例如 bean context )
• Using template method design pattern (注:模板方法的设计模式)
• Using strategy design pattern (注:策略模式)
容器的职责
1 实现与任务的执行 要解耦
2 关注设计上的最终目标 而不是具体实现
3 对象生命周期的管理
4 配置
一些开源组件的主要实现
接下来看看IOC 容器在一些开源组件上的主要实现
- Java SE : Java Beans,Java ServiceLoader SPI ,JNDI(Java Naming and Directory Interface)
- Java EE :EJB(Enterprise Java Beans) Servlet
- 其他开源
• Apache Avalon(http://avalon.apache.org/closed.html)
• PicoContainer(http://picocontainer.com/)
• Google Guice(https://github.com/google/guice)
• Spring Framework(https://spring.io/projects/spring-framework)
从EJB 3.0 开始,就出现了所谓的依赖注入和依赖查找并存的情况,之前大部分都是依赖查找形式。 这也算是一个小的分水岭了
接下来针对一个具体的框架来进行特性说明
Java Beans 作为IOC 容器特性
传统IOC容器的实现
特性:
- 依赖查找
- 生命周期
- 配置元信息
- 事件
- 自定义
- 资源管理
- 持久化
接下来重点聊下IOC 的依赖注入和依赖控制
Spring IoC 容器
IOC 是控制反转,这里再讲Spring IOC时,仍然是结合IOC 的特性来讲,在Spring里 是如何做到的依赖查找和依赖注入,再依赖查找里 具体是通过什么形式,再依赖注入里又是通过什么形式。将结合代码来看一下。这是这篇文章我最想详细介绍的内容
依次展示几个依赖查找和注入的案例
代码待补充