夯实Spring系列|第一章:IoC到底是什么?

1.IoC 发展简介

1.1 什么是 IoC?

以下内容是维基百科对 IoC 的解释

Inversion of control(IoC) is a programming principle.

简单来说,IoC 是一种编程原则,相对于传统的控制流(串行,顺序执行)。IoC 是典型的反转控制,IoC 相对传统软件架构来说更为复杂,它可以解耦我们的一些相关的配置。

1.2 它从哪里来?

最早应该是 1983 年,Richard E.Sweet 在《The Mesa Programming Environment》中提出的“Hollywood Principle”(好莱坞原则);

好莱坞原则:导演对来面试的演员说:不要给我们打电话,我们会打给你。

2004年,Martin Fowler 在《Inversion of Control Container and Dependency Injection pattern》中提出了自己对 IoC 以及 DI 的理解。

2005年,Martin Fowler 在《InversionOfControl》对 IoC 做了进一步说明

2.IoC 主要实现策略

Spring 两位作者-《J2EE Development without EJB》书中提到了 IoC 实现的主要策略 ,分别是依赖查找(Dependency Lookup)和依赖注入(Dependency Injection)。

  • Dependency Lookup : The Container provides callbacks to components,and a lookup context. This is the EJB and Apache Avalon approach. It leaves the onus on each component to use container APIs to lookup resources and collaborators. The Inversion of Control is limited to the container invoking callback methods that application code can user to obtain resources.
  • Dependency Injection : Components do no lookup; they provide plain Java methods enabling the container to resolve dependencies. The container is wholly responsible for wiring up components, passing resolved objects in to JavaBean properties or constructors. Use of JavaBean properties is called Setter Injection; use of constructor arguments is called Constructor Injection.

3.IoC容器的职责

3.1 通用职责

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

4.现有 IoC 容器的实现

其实IoC 并非 Spring Framework 的专利。

  • Java SE
    • Java Beans
    • Java ServiceLoader SPI
    • JNDI(Java Naming and Directory Interface)
  • Java EE
    • EJB(Enterprise Java Beans)
    • Servlet
  • 开源
    • Apache Avalon
    • PicoContainer
    • Google Guice
    • Spring Framework

5.依赖查找 VS 依赖注入

优劣对比

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

没有绝对的好与坏,只有相对的合理

6.构造器注入 VS Setter注入

6.1 构造器注入

  • spring官方鼓励使用构造器注入

    • 优点
      • 被管理的对象都能有比较一致的状态(比较符合面向对象的思想)
    • 缺点
      • 参数过多的话,代码不是太简洁

6.2 Setter注入

  • setter方法注入应该主要用于可选性的注入
    • 通常可以让这个对象变的可以配置
    • 可以控制属性设置的顺序

总结:

没有绝对的好与坏,只有相对的合理,个人更倾向于构造器注入,因为在实际开发过程中,可以避免很多问题,比如状态不确定性的被修改。

7.面试题

7.1 什么是IoC?

简单的说,IoC 是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入两种实现,后续文章会有对应的专题对这两种实现进程讨论。

7.2 依赖查找和依赖注入的区别?

依赖查找是主动或者手动的依赖查找方式,通常需要依赖容器或者标准 API 实现,比如 BeanFactory.getBean()。而依赖注入则是手动或者自动依赖绑定的方式,无需依赖特定的容器和 API ,比如可以通过 XML 配置 byType、byName,又或者是我们最熟悉的 @Autowired

7.3 Spring作为IoC容器有什么优势?

可以从以下方面进行回答:

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

8.参考

  • 极客时间-小马哥《小马哥讲Spring核心编程思想》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值