ioc详解

手把手教你用Proteus仿真51单片机抢答器:倒计时+蜂鸣器报警完整项目 本文详细介绍了使用Proteus软件仿真51单片机智能抢答器的完整项目流程。通过系统架构设计、核心元件选型(如74LS30用于按键中断编码),结合状态机编程,实现了带可调倒计时、数码管显示和蜂鸣器报警的八路抢答器功能。项目涵盖了从原理图绘制到代码调试的全过程,是学习嵌入式系统开发的绝佳实践。 阅读详情

IoC全称Inversion of Control,直译为控制反转。这是一种设计理念,并非技术。
在明白控制反转之前,应该知道“反转”反的是什么。

被反转的正转
我们从生活中的做饭场景开始。

在家做菜与餐馆吃饭

自己做饭:想好要做的菜——自己准备原料——自己烹饪——成品
//Rectangle.java
public class Square implements Shape {
public class Circle implements Shape {
      if(shapeType.equalsIgnoreCase("CIRCLE")){
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
}

      //call draw method of Circle
      shape1.draw();
}

    private ShapeFactory(){}
            shape = (Shape) Class.forName(className).newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
oC全称Inversion of Control,直译为控制反转[-]()这是一种设计理念,并非技术[-](http://jvquant.com/wiki/券商交易接口/查询交易.html)
在明白控制反转之前,应该知道“反转”反的是什么[-](http://jvquant.com/wiki/数据库/股票基本信息查询.html)

被反转的正转
我们从生活中的做饭场景开始[-](http://jvquant.com/wiki/数据库/沪深股票历史数据下载.html)

在家做菜与餐馆吃饭
我们在做饭的时候有很多个步骤,需要准备原料,厨具等等[-](http://jvquant.com/wiki/数据库/沪深分时数据.html)最后通过一定的顺序加入我们的原料,再进行翻炒等烹饪操作就能够得到一份菜了[-](http://jvquant.com/wiki/行情/SDK/Golang接入WebSocket行情.html)
我们想吃一份菜不一定需要自己做,也可以去餐馆吃,只需要告诉餐馆我们要吃什么,餐馆就能自己做好给到我们手上吃

控制的正与反
在这个做饭的例子中,正转就是我们自己准备原料,自己通过烹饪方法做菜,而控制反转就是我们去的餐馆[-](http://jvquant.com/wiki/行情/SDK/Python接入WebSocket行情.html)
这个时候我相信你还是不明白这俩有什么关系,为什么正转是自己做,而反转变成了餐馆的概念[-](http://jvquant.com/wiki/行情/解析行情.html)没关系,我们继续深入[-](http://jvquant.com/wiki/帮助/计费标准.html)

什么是反转,反转在哪?
我们再回顾一遍,我们吃到菜是个什么流程[-]()

自己做饭:想好要做的菜——自己准备原料——自己烹饪——成品
餐馆:想好要吃的菜——给餐馆说——餐馆烹饪——成品
我们自己设计一整套程序的时候,往往是有很多模块的,每个模块会相互协作使用,最终形成一个大的程序,我们需要自己一个一个将模块联系起来[-](http://jvquant.com/wiki/数据库/沪深K线查询.html)这就是我们自己做菜的过程
而控制反转IoC就是将所有需要的模块通过一个容器(可以理解为一个控制终端)联系起来,我们不需要思考这个模块会不会使用其他的模块才能完成,全部都由容器帮我们完成联系[-](http://jvquant.com/wiki/行情/发送订阅指令.html)这就是我们去餐馆的过程,我们不用做菜,交给餐馆,而一个个原材料就是餐馆去准备的[-](http://jvquant.com/wiki/行情/解析/港股行情解析.html)
最终我们能看到反转的地方就在于,我们本来是靠自己去一个一个联系其模块来,但我们全都交给了容器,容器替我们完成了联系,我们反转了对自己的依赖,本来是依赖自己去联系的,现在变依赖容器,反转就在这[-](http://jvquant.com/wiki/开始使用/接入使用.html)换句话说,控制反转应该叫控制权反转

为什么要有IoC
这个时候你会说,这样不是省了很多事吗,省事不就是IoC的意义吗?
对了,但没完全对[-](http://jvquant.com/wiki/券商交易接口/交易接入.html)换句话说,省事了,但没完全省[-](http://jvquant.com/wiki/券商交易接口/券商交易接口调用.html)因为每个依赖还是要我们自己去配置的,只不过换了种方式(这个后面再说),IoC容器只是封装而已,但是这并不代表IoC没用,IoC最大的意义不在于它更方便,而是在于它能解耦[-](http://jvquant.com/wiki/帮助/价格/实时行情.html)

解耦在哪?
虽然容器只是帮我们完成了每个模块的依赖,但是我们前面说到,控制反转最大的意义就是我们只用把需要的功能给到容器,容器再去思考其他的,这样的话我们再写每个模块功能的时候就会更加独立,不用考虑依赖,每个模块变得更加独立那不就是解耦的初衷吗

实例
我们最后再来个实例看看效果
我们先创建一个接口

public interface Shape {
    void draw();
}
然后实现几个个接口

//Rectangle.java
public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}
//Square.java
public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}
//Circle.java
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

然后根据传入信息的不同,生成不同的对象

public class ShapeFactory {

   //use getShape method to get object of type shape
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}
最后main方法调用,获取对象

public class FactoryPatternDemo {

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();

      //get an object of Circle and call its draw method.
      Shape shape1 = shapeFactory.getShape("CIRCLE");

      //call draw method of Circle
      shape1.draw();

      //get an object of Rectangle and call its draw method.
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

      //call draw method of Rectangle
      shape2.draw();

      //get an object of Square and call its draw method.
      Shape shape3 = shapeFactory.getShape("SQUARE");

      //call draw method of circle
      shape3.draw();
   }
}
这就是工厂模式,工厂实现的方式原理是根据传入的某个参数获取一个对象,一旦我们新增一个shape类型,就修改ShapeFactory 类[-](http://jvquant.com/wiki/数据库/智能语义查询.html)这种方式不够灵活,并违背了软件设计的开闭原则[-](http://jvquant.com/wiki/数据库/综合数据查询.html)

开闭原则:一个软件实体, 如类, 模块, 函数等应该对扩展开放, 对修改封闭.
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况[-](http://jvquant.com/wiki/行情/数据库行情.html)
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对已有代码进行任何修改[-](http://jvquant.com/wiki/行情/SDK/C++接入WebSocket行情.html)

要想做到不修改的动态查看类的类型,反射就是一个不错的选择[-](http://jvquant.com/wiki/行情/SDK/Java接入WebSocket行情.html)

Java 反射(Reflection)是一个强大的特性,它允许程序在运行时查询、访问和修改类、接口、字段和方法的信息[-](http://jvquant.com/wiki/行情/订阅/美股行情订阅.html)

那么思路就有了,最后的修改就是这样:

public class ShapeFactory {

    private ShapeFactory(){}
    public static Shape getInstance(String className){
        Shape shape = null;
        try {
            shape = (Shape) Class.forName(className).newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return shape;
    }
}
而利用反射的代码就封装到了Class.forName里面

@CallerSensitive
public static Class<?> forName(String className)
                throws ClassNotFoundException {
     Class<?> caller = Reflection.getCallerClass();
     return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
IOC底层原理主要用到了3种技术:工厂模式、反射、XML解析
XML文件的配置这里我们不多说,下一章我们具体来说如何做,这里就明白我们的依赖管理都是类似于maven中的pom.xml一样管理的就行[-](http://jvquant.com/wiki/帮助/价格/委托交易.html)

工厂模式、反射、XML解析的结合完成了IoC的所有技术概括,形成了巧妙的化学反应,我们后面spring都是基于整个概念在前行[-](http://jvquant.com/wiki/券商交易接口/查询持仓.html)
[-](http://jvquant.com/wiki/行情/解析/美股行情解析.html)

参考链接:https://zhuanlan.zhihu.com/p/17924717407

论文理解【LLM-OR】——【SIRL】Solver-Informed RL: Grounding Large Language Models for Authentic Optimization M 本文提出第一种针对基于 LLM 的 OR 问题建模和求解任务的 RLVR 方法,其基于求解器得到可验证奖励,设计了 Partial KL 强化目标函数和两阶段奖励课程训练方法,达成了 SOTA 性能 阅读详情

相关推荐

Unity3d游戏开发工程师笔试题学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、学习背景二、错题记录2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 提示:这里可以.

m0_54231818的博客 5464

IOC(控制反转)

4.1.什么是Bean:Spring容器中的核心组件在Spring框架中,Bean是由Spring IOC容器管理的对象,代表应用程序中的组件。Bean可以是任何Java对象,比如服务类、数据访问层类或其他业务逻辑类。Spring容器通过读取配置或注解,管理这些Bean的生命周期,包括创建、配置、依赖注入和销毁。Bean是Spring应用程序的基本构建块,Spring容器通过依赖注入来管理这些对象的依赖关系,从而实现松耦合设计。4.2.配置Bean的多种方式。

m0_73837751的博客 6531

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2298

浅谈IOC--说清楚IOC是什么

博文目录 1.IOC的理论背景 2.什么是IOC 3.IOC也叫依赖注入(DI) 4.IOC的优缺点 5.IOC容器的技术剖析 6.IOC容器的一些产品 7.参考博文 本文旨在用语言(非代码)说清楚IOC到底是什么,没有什么高深的技术,园中的老牛、大虾们看到这里可以绕行了,以免浪费您宝贵的时间。IOC这个东西DebugLZQ早就想写了,但是出于对文章权威性的考虑(不能误人子弟- -...

weixin_33929309的博客 3401

别再到处找模型了!手把手教你用Xinference+Docker部署本地私有大模型(Llama2/Qwen实战)

本文详细介绍了如何使用Xinference和Docker部署本地私有化大模型(如Llama2/Qwen),涵盖硬件配置、模型管理、Docker部署及性能优化等关键步骤。通过实战案例,帮助开发者快速构建企业级AI推理服务,确保数据安全与高效运行。

weixin_28683065的博客 232

上网第二课:办了百兆宽带,为什么测速只有一半?

最慢的那一环。

qq_36765170的博客 110

Spring框架IoC核心详解

Spring框架IoC核心详解 https://baijiahao.baidu.com/s?id=1613047743708688271&wfr=spider&for=pc

lizhe10177的专栏 334

WhatsApp API接口的隐秘角落:从协议解析到自定义消息引擎

本文深入解析WhatsApp API接口的隐秘角落,从协议逆向工程到自定义消息引擎开发实战。通过分析WhatsApp的二进制XML协议和加密机制,构建超越官方API限制的自定义消息引擎,实现高效、灵活的即时通讯解决方案。文章还提供了企业级架构设计和风控规避策略,助力开发者突破官方限制,提升消息到达率和成本效益。

q3r4s5t的博客 761

【Spring】一问详解什么是Spring IoC和DI

一问详解什么是spring ioc

Hanson的博客 1146

Python地理数据处理 十七:植被物候提取和分析(Savitzky-Golay)

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于生态工程保护建设和植被自然生长等因素,中国陆地生态系统发挥了重要的碳汇作用。因此,定量评估植被时空动态变化是制定生态系统可持续发展目标和衡量生态系统固碳潜力的重要前提,卫星遥感数据衍生的生态参量产品为研究长时间序列全球及区域植被时空变化提供了重要数据源。SG滤波能够对物候信息进行平滑,并提取其中的物候信息

amyniez的博客,欢迎交流讨论 4247

(27)FPGA实现AD7768接口(六)

AD7768/AD7768-4 为8通道和4通道24位同步采样模数转换器(ADC)。通过可选的功耗模式和数字滤波器选项可重新配置AD7768/AD7768-4以适应多种应用,如工业输入/输出模块、仪器仪表、音频测试、控制回路和状态监控。FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。

m0_46498597的博客 997

IOC与AOP详解

IOC与AOP详解 转载:IOC与AOP概念 手写实现IOC和AOP

weixin_44175482的博客 172

华为OD机试双机位A卷 - 小明减肥 (C++ & Python & JAVA & JS & GO)

华为OD机试2025双机位A卷 小明减肥,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 708

IOC详解

IOC概念 什么是IOC: 控制反转,把对象创建和对象间的调用过程,交给Spring进行管理。 使用IOC可以降低耦合度。 IOC底层原理:XML解析,工厂模式,反射。 图解IOC底层原理: IOC思想基于IOC容器完成的,IOC容器底层就是对象工厂 Spring提供IOC容器实现两种方式: 1.BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,不提供开发人员使用。加载配置文件的时候不会去创建对象,在获取对象使用才去创建对象。 2.ApplictionContext:Bean

weixin_48479053的博客 2270

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring IoC详解

对于同一个类,如何定义多个对象呢?我们看下@Bean的使用@Component@Bean@Bean定义了多个对象的话,我们根据类型获取兑现,获取的是哪个对象呢?运行结果:报错信息显示: 期望只有一个匹配,结果发现了两个,user1,user2接下来我们根据名称来获取bean对象运行结果:可以看到,@Bean可以针对同一个类,定义多个对象.

2302_79392547的博客 1167

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JavaEE进阶(5)Spring IoC&DI:入门、IoC介绍、IoC详解(两种主要IoC容器实现、IoC和DI对对象的管理、Bean存储、方法注解 @Bean)、DI详解:注入方式、总结

JavaEE进阶(5)Spring IoC&DI:入门、IoC介绍、IoC详解(Spring的两种主要IoC容器实现、IoC和DI对于对象的管理、Bean的存储、类注解之间的关系、学习分析错误日志、方法注解 @Bean)、DI详解(属性注入、构造方法注入、Setter注入、@Autowired存在问题)、总结(Spring, Spring Boot 和Spring MVC的关系以及区别、Bean的命名、常见面试题)

m0_74343467的博客 1488

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring IOC详解

Spring的IoC容器和依赖注入机制为Java应用程序提供了强大的解耦能力。通过将对象的创建和依赖管理交给容器,开发者可以更专注于业务逻辑的实现。IoC容器不仅简化了对象的创建和管理,还通过自动装配和作用域管理提供了灵活的配置选项。理解并掌握Spring的IoC容器对于构建可维护、可测试的应用程序至关重要。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章Spring中的控制反转(IoC)和依赖注入(DI)一篇文章讲透spring ioc (概念、原理、实例、应用场景、面试题)

ning的博客 1619

Spring IOC 详解

Spring IOCIOC什么是IOCIOC容器介绍BeanFactory和ApplicationContext的区别Spring容器管理对象Spring依赖(pom.xml)Spring的配置文件Bean类的实例化方式(demo)创建实例类基于xml配置文件实现Bean基于无参构造函数实例化静态工厂方式实例化基于普通工厂方法实例化基于注解的方式装配Beanspring配置文件引入context约束实例类上添加注解 IOC 什么是IOC Ioc—Inversion of Control,即“控制反转”,不是

SunStaday的博客 490

Spring中的IOC详解

单例Bean和多实例Bean的生命周期主要区别在于实例化和销毁的管理方式,单例Bean在容器启动时创建一个实例,并由容器负责管理其生命周期的完整过程。在Spring框架中,Bean是应用程序的核心组件,它们由Spring容器创建、组装和管理,以帮助开发者实现松耦合、可测试和可维护的代码。IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。Bean的自动装配是Spring框架提供的一种便捷的方式,用于自动解析和设置Bean之间的依赖关系,而无需显式配置每一个依赖关系的方式。

2509_93961667的博客 852

【javaEE】IOC详解

通过上篇的文章,我们已经知道了和DI的基本操作,接下来我们来系统的学习SpringIoC和DI 的操作.

mr_yuanshen的博客 1349

IoC 和 DI 详解

IoC和DI详解

qq_67549203的博客 770

Spring中IOC详解

一、IOC的原型 IOC ----控制反转 比如我们有一个功能是获取用户数据,我们使用Dao层实现这个功能,再在Service层调用这个功能。但是我们每增加一个接口,比如获取mysql中的数据,就要修改原来的代码,如果再增加一个新的接口,又需要去service实现类中修改对应的实现。 解决方法 用户实际调用的是业务层,dao层他们不需要接触 UserServiceImpl userService = new UserServiceImpl(); userSe

qq_41359998的博客 1万+

IOC概念的详解

1.1.IOC是什么?        Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由...

菜鸟不会飞 1万+

Spring IOC的原理及详解

[Spring框架]Spring IOC的原理及详解。 看后 受益匪浅,这里再重温一遍Spring IOC 1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从...

Yoke 323

IoC详解

1.定义:IoC是一种模式。IoC(Inversion of Control)中文译为控制反转(即“不用你找,我来提供给你”)。控制反转意味着在系统开发过程中,设计的类将交由容器(spring中是通过applicationContext.xml控制的)去控制,而不是在类的内部去控制,类与类之间的关系将交由容器处理,一个类在需要调用另一个类时,只要调用另一个类在容器中注册的名字就可以得到这个类的实例

Forrest He的专栏 3765
上一篇: Pulsar客户端如何控制内存使用
下一篇: CUDA入门及使用
觉醒赵小四
博客等级 码龄9年 373粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值