Spring(02)重新认识 IoC

目录

  • Spring(02)重新认识 IoC
    • 1. IoC 发展简介
    • 2. IoC 主要实现策略
    • 3. IoC 容器的职责
    • 4. IoC 容器的实现
    • 5. 传统 IoC 容器实现
    • 6. 轻量级 IoC 容器
    • 7. 依赖查找VS. 依赖注入
    • 8. 构造器注入 VS. Setter 注入
    • 9. 面试题精选

Spring(02)重新认识 IoC

1. IoC 发展简介

  • 1983年,Richard E. Sweet 在《The Mesa Programming Environment》中提出 “Hollywood Principle”(好莱坞原则)
  • 1988年,Ralph E. Johnson & Brian Foote 在《Designing Reusable Classes》中提出 “Inversion of control”(控制反转)
  • 1996年,Michael Mattsson 在《Object-Oriented Frameworks, A survey of methodological issues》中将“Inversion of control”命名为“Hollywood principle”
  • 2004年,Martin Fowler 在《Inversion of Control Containers and the Dependency Injection pattern》中提出了自己对 IoC 以及 DI 的理解
  • 2005年,Martin Fowler 在《Inversion Of Control》对IoC 做出进一步的说明

2. IoC 主要实现策略

维基百科(https://en.wikipedia.org/wiki/Inversion_of_control)

Implementation techniques 小节的定义:

In object-oriented programming, there are several basic techniques to implement inversion of control. These are:

  • Using a service locator pattern(SPI)
  • Using dependency injection, for example(依赖注入)
    • Constructor injection(构造器注入)
    • Parameter injection(参数注入)
    • Setter injection(setter 方法注入)
    • Interface injection(接口回调)
  • Using a contextualized lookup(依赖查找)
  • Using template method design pattern(模板方法)
  • Using strategy design pattern(策略模式)

3. IoC 容器的职责

  • 依赖处理
    • 依赖查找
    • 依赖注入
  • 生命周期管理
    • 容器
    • 托管的资源(Java Beans 或其他资源)
  • 配置
    • 容器
    • 外部化配置
    • 托管的资源(Java Beans 或其他资源)

4. IoC 容器的实现

  • Java SE
    • Java Beans
    • Java ServiceLoader SPI
    • JNDI(Java Naming and Directory Interface)
  • Java EE
    • EJB(Enterprise Java Beans)
    • Servlet(eg: Tomcat、Jboss)
  • 开源
    • 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

5. 传统 IoC 容器实现

Java Beans 作为 IoC 容器

  • 特性
    • 依赖查找
    • 生命周期管理
    • 配置元信息
    • 事件
    • 自定义
    • 资源管理
    • 持久化
  • 规范
    • JavaBeans:https://www.oracle.com/technetwork/java/javase/tech/index-jsp-138795.html
    • BeanContext:https://docs.oracle.com/javase/8/docs/technotes/guides/beans/spec/beancontext.html

6. 轻量级 IoC 容器

7. 依赖查找VS. 依赖注入

类型 依赖处理 实现便利 侵入性 API依赖性 可读性
依赖查找 主动获取 相对繁琐 侵入业务代码 依赖容器API 良好
依赖注入 被动提供 相对便利 低侵入 不依赖容器API 一般

8. 构造器注入 VS. Setter 注入

  • 构造器注入只能根据参数的顺序执行,而 Setter 注入则是无序。
  • 构造器注入可以将字段设置为 final,保证一致性。
  • 很多时候,我们希望 bean 一旦初始化后就不能被修改,此时可以使用构造器注入。

9. 面试题精选

问题1:什么是 IoC ?

答:简单地说,IoC 是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现。

问题2:依赖查找和依赖注入的区别?

答:依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准 API 实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和 API。

问题3:Spring 作为 IoC 容器有什么优势?

答:Spring 优势有

  • 典型的 IoC 管理,依赖查找和依赖注入
  • AOP 抽象
  • 事务抽象
  • 事件机制
  • SPI 扩展
  • 强大的第三方整合
  • 易测试性
  • 更好的面向对象

每天用心记录一点点。内容也许不重要,但习惯很重要!

你可能感兴趣的:(Spring(02)重新认识 IoC)