码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 浅谈IOC编程思想


    浅谈IOC编程思想

    文章目录

    • 浅谈IOC编程思想
      • 为什么写IOC
      • IOC起源
      • 假设没有IOC
      • 什么是IOC
      • IOC容器有什么有点和有什么缺点
      • IOC职责
      • IOC的实现

    为什么写IOC

    在编程中经常用到IOC这种思想,比如Spring中使用注解@Autowire或者@Resource等注解就可以直接生成一个对象。虽然十分的方便但是这种思想是如何产生的?

    IOC起源

    我网上查找的资料就是Michael Mattson 在 1996年发布的《Object Oriented Frameworks: a survey on methodological issues》论文中最先提出的,并且他第96页的结论中写到。
    An object-oriented framework is “a (generative) architecture designed for maximum reuse, represented as a collective set of abstract and concrete classes; encapsulated potential behaviour for subclassed specializations.”

    假设没有IOC

    系统内的依赖如同一个图的结构

    a
    b
    c

    此时类c依赖于a接口的实例和b接口的实例 ,但是c的功能可能并不关心a和b具体的实现,它需要的仅仅需要是a或者b类型实例即可。这时候就需要手动去 new出来 a与b的具体实现类来给到c那么这样的设计就是很不合理的。

    1. 耦合性高,可维护性差
    2. 违反依赖倒置原则

    什么是IOC

    IOC 是Inversion of Control的缩写表示 控制反转
    在整个系统中IOC就相当于哆啦A梦的口袋,任何对象可以通过这个口袋中拿到。有了IOC容器之后再看c对象的依赖,它虽然还是依赖于a 和b但是情况却不一样了

    IOC容器
    a
    b
    c

    如图所示,此时的情况相当于c c的依赖交由IOC容器进行管理,在程序运行时IOC容器主动的将a和b进行注入到c中。这时候 c由主动创建a和b两个依赖的行为被反转为被动接受IOC容器注入a和b依赖

    思考一下?

    既然是控制反转那么哪些控制被反转了,由上面介绍可见c的依赖控制由主动变为了被动。是获取以来的过程被反转了 恭喜你得到了和2004年,Martin Fowler一样的结论。

    IOC容器有什么有点和有什么缺点

    优点 它的优点当然是它出生时解决的痛点

    1. 依赖解耦,可维护性提高
    2. 资源集中管理,让资源的可配置和更易管理。

    缺点

    1. 复杂性提高效率变慢(原本注入一个依赖就可以,现在却多了整个IOC容器,所以不适用微小型项目)

    IOC职责

    如下图所示

    IOC职责
    依赖处理
    生命周期管理
    配置
    依赖注入
    依赖查找
    容器生命周期
    托管的资源生命周期
    容器配置
    托管的资源配置
    外部化配置

    IOC的实现

    IOC有很多的实现
    比如

    • JavaEE实现
      1. JavaBeans
      2. Java ServiceLoader SPI
      3. JNDI (Java Naming and Directory Interface)
    • JavaSE实现
      1. EJB
      2. Servlet
    • 其他开源实现
      1. Apache Avalon
      2. PicoContainer
      3. Spring Framewrok

    可见IOC并不是Spring独有,Spring的IOC实现也是参考了一些其他框架的,关于SpringIOC的详细信息可以参考一下网址 【Spring官方文档】

  • 相关阅读:
    虚拟内存和页表
    vite — 超快且方便的编译工具
    Java开发者的神经网络进阶指南:深入探讨交叉熵损失函数
    Java贪心算法
    Elasticsearch系列之:Centos7安装部署Elasticsearch详细步骤
    利用在Tomcat上部署servlet程序(手动布置加强关于servlet知识的理解,当前的idea是可以实现自动部署的)
    RadSegNet: A Reliable Approach to Radar Camera Fusion 论文笔记
    【学习笔记】RabbitMQ01:基础概念认识以及快速部署
    邮件安全不容忽视,教你如何防止邮件泄密!
    如何提升数据质量
  • 原文地址:https://blog.csdn.net/sinat_35045195/article/details/126136626
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号