ioc缩写的中文含义(se缩写的中文含义)
ioc缩写的中文含义(se缩写的中文含义)
导航
共享充电宝IOC思考复杂依赖关系IOC定义春天的IOC和工厂模型IOC容器参考的技术分析结论本节摘自智纳工坊《春靴之战纪实》第十三篇,感谢阅读,预计阅读3分钟。
对象本身从它所依赖的管理中解放出来,这种管理的责任转移给第三方。
分享充电宝
尴尬的
手机一直以来都是我们生活中不可或缺的一部分,但是伴随着手机充电的问题。
可能是2011年,笔者和同学在学校买火车票。因为是晚上的火车票,所以笔者认为这是提前购买。学生约定晚上到火车站候车室,把车票发给学生。
下午五点半,笔者早早就到了火车站,大概二十分钟就到了。到站后刚好赶上排队(一般是一个小时的预检),但我正好在现场——手机没电了。还得求助于我查票,这还是在同学中。我同学已经进站了,在等二楼。我礼貌地邀请售票员跳过我,先检查一下门卫。我也想联系我的同学。
我还记得一个电话号码或者打开公用电话,但是我不记得我同学的手机号码.我带着队伍在排队,检查通道开始关闭。
我想给我自己的金属或财宝充电。多少钱?
此时,我同学突然冲下楼,给了我票,解决了这个尴尬。
因为手机没电,而且有很多没有任何充电线,我想很多人都有生活经验。
多年以后,很多同学可能会觉得这很可笑。为什么不分享充电宝?因为没有。
分享充电宝
虽然这样的事情屡见不鲜,但依然没有引起手机厂商的重视(直到今天,手机的续航能力依然存在问题)。通常,我们会做出门前发生的事情:
拿手机换大容量电池,带电话本(需要时不时到)完善充电宝,但是上面的方法还是很高级的,所以通常情况下,手机是没电的,只能通过以下次数充电:
通过充电宝寻找路人。在酒店吃饭,请店家帮忙。去酒店充电.另外,由于手机厂商不同,充电线接口不一致,你可能还是需要买充电线。
这些不仅增加了你的时间和金钱成本,也增加了新的沟通成本。
于是,共享充电宝诞生了。它为用户提供了各种造型充电电路和电源,用户只能使用它。
共享计费宝的模式是将收费过程中的所有设备和程序打包到一个盒子里(类似于一个容器),与IOC思维的软件架构并不匹配。
IOC思考
IOC(控制反转)控制反转是对象编程减少代码间耦的一种设计原则。基本思想是通过第三方和依赖来解耦对象。
对象之间的复杂依赖项
在一个面向对象的软件系统中,底层实现由N个对象组成,这些对象之间相互传递,最终实现系统的业务逻辑。
注意:对于面向对象,请参考“类和实例的通俗理解”
在上图的齿轮排列中,它有几个独立的齿轮,而这些齿轮又连接在一起,共同工作,完成任务。在这样的齿轮组中我们可以看到,如果齿轮出了问题,可能会影响整个齿轮组的正常运转。
齿轮组中齿轮之间的啮关系非常类似于软件系统中对象之间的耦关系。对象之间的耦关系是必然的、必要的,是协同工作的基础。
然而,随着软件系统规模的增大,对象之间的依赖关系变得越来越复杂,经常会出现对象之间的多重关系。
为了解决对象间过度耦的问题,软件专家提出了IOC理论来实现对象间的“解耦”,并且这一理论已经成功应用于实践。
IOC定义
控制反转(IOC)是面向对象编程的设计原则,可以用来减少计算机代码之间的耦。(百度百科)
既然名字叫控制,那我们就来看看什么是控制,发生了什么。
早在2004年,马丁福勒就提出了“什么是逆转?”这个问题。他总结了依赖的对象依赖的对象,因为大部分应用都是通过两个或两个以上的类来实现彼此之间的企业逻辑,这样每个对象都需要通过协作来获取对象。(指它所依赖的对象)。如果采集过程本身实现,会导致代码耦度高,维护调试困难。
控制的内容:控制对象的创建和销毁是指控制对象的生周期。变化是:在我们创建对象之前是新的,现在有了IOC,是指处理对象对IOC容器的控制。IOC从“第三方”分离具有依赖关系的对象,如下所示:
由于中间位置引入的“第三方”是IOC容器,A、B、C、D四个对象没有耦关系,档位之间的传递依赖于“第三方”,所有对象的所有控制权都交给了“第三方”IOC容器,因此IOC容器成为了整个系统的关键核心。它的作用就像一种“粘剂”,所有的物体都粘在一起。如果这个“粘剂”没有丢失,物体之间就会互相丢失,这就是IOC容器作为“粘剂”的由来。
为了更直观的理解,我们可以占据,这一次,A、B、C、D四个对象之间没有耦关系,互不接触。也就是当你意识到的时候,不需要考虑B、C、D,对象之间的依赖已经降到了。
,我们用图片来介绍奥委会。
注:我
OC可以被视为一种新的设计模式,但理论和时间成熟相对较晚,而不是包含在GOF中。见百度Baisu - 控制逆IOC在春天IOC和工厂模型实施IOC主要用三种技术:工厂模型,XML分析,反思。工厂模型广泛用于Java / C#。在出厂模式中,我们不会将对象公开到客户端到客户端,并使用通用接口引用新创建的对象。工厂模型相对简单
客户端(客户)需要一个产品对象,无需通过新的关键字是直接创建的,而是为工厂(工厂)发起新对象请求。在此过程中,客户端只需要为所需对象提供对象的类型。工厂实例化了一个特定的产品对象,然后返回客户端(客户)产品对象(转换为抽象类类型)。客户使用产品对象无需了解特定的实现细节。根据实践,这里仍然是一个简单的演示
第1步创建一个界面形状.java
公共界面形状{ void draw();}第2步创建实现相同接口的特定类。几个类如下所示rectangle.java.
公共类矩形实现形状{ @Override. public void draw(){ system.out.println(“internangle :: draw()方法”。); }}Square.java.
公共类广场进口形状{ @Override. public void draw(){ system.out.println(“square :: draw()方法中。); }}circle.java.
公共类圆圈实现形状{ @Override. public void draw(){ system.out.println(“内部圈子:: draw()方法。”); }}第3步创建工厂以基于给定的信息ShapeFactory.java生成特定类
公共类shapefactory { //使用getShape方法获取类型的对象 公共形状getshape(string shapendety){ if(shapeType == null){ 返回null; } if(shapeType.equalsignoreCase(“圆”)){ 返回新圆圈(); }否则if(shapertype.equalsignorecase(“矩形”){ 返回新的矩形(); }否则if(shapeType.equalsignoreCase(“Square”)){ 返回新广场(); } 返回null; }}第四步使用工厂通过交付类型获取特定类的对象。 FactoryPatternndemo.java.
公共类FactoryPatterndemo { 公共静态void main(String [] args){ shapefactory shapefactive = new shapefactory(); //获取圆的对象并调用其绘制方法。 形状形状1 = shapefactory.getshape(“圆圈”); //呼叫绘制方法 shape1.draw(); //获取矩形对象并调用其绘制方法。 形状形状2 = shapefactive.getshape(“矩形”); //呼叫绘制方法的矩形 shape2.draw(); //获取广场的对象并呼唤其绘制方法。 形状形状3 = shapefactory.getshape(“Square”); //呼叫绘制方法 shape3.draw(); }}引进工厂模型的优点是显而易见的:添加新的形状(如三角形三角形),我们不必修改现有体系结构,而是只需要shapefactory.扩展(如果/开关)。以上工厂实现的方式是基于传入参数的对象。添加形状类型后,修改ShapeFactory类。这种方式不够灵活,违反了软件设计的开放和关闭原理。通过反射,每当添加新接口时,很容易修改出厂类代码。注意:反射机制是指程序中的任何类的操作,可以了解属于任何对象的类,您可以了解任何类的任何成员变量和方法,可以调用任何一个对象属性和方法。这种动态采集程序信息和动态呼叫对象的功能称为Java语言的反射机制。 (百度百科全书 - Java反射机制)我们只需要shapefactory.重建,如下:
公共类shapefactory { 私有shapefactory(){} 公共静态形状getInstance(String ClassName){ 形状形状= null; 尝试 { 形状=(形状)class.forname(classname).newinstance(); catch(classnotfoundException e){ e.printStacktrace(); 捕获(IllowAlvestException e){ e.printStacktrace(); 捕获(实例化exception e){ e.printStacktrace(); } 返回形状; }}在这里,我们将类名作为参数作为参数到出厂,工厂使用反射机制来查找相应的对象并创建实例。什么 ??你说你没有看到反思的影子。然后去class.forname看它。
@callersissitive.公共静态类 forname(字符串类名称) 抛出classnotfoundException { 班级 来电者= reflection.getCallerClass(); 返回forname0(classname,true,classloader.getclassloper(呼叫者),来电者;}然后,让我们参加一个测试用例。
@测试void testfactfactory(){/ ** *获取循环实例 * * /形状shapecircle = shapefactory.getInstance(“com.zhike.blogmanager.shape.circle”);shapecircle.draw();/ ** *获取矩形实例 * * /形状shaperectangle = shapefactory.getInstance(“com.zhike.blogmanager.shape.rectangle”);shaperectangle.draw();/ ** *获得正方形实例 * * /形状shapeSquare = shapefactory.getInstance(“com.zhike.blogmanager.shape.square”);shapesquare.draw();}看看执行结果
2021-10-04 22:41:50.514 ==== [main]信息com.zhike.blogwebapi.blogwebapiapplicationstests - 启动博客WebapiaPplicationTess 6.359秒(JVM运行8.133)内部圈子:: draw()方法。内部矩形:: draw()方法。在方形:: draw()方法。流程完成退出代码0从角度来看,我们进一步验证了我们的想法。当我到达这里时,我会问我是否有读者。您是否与工厂和IOC有关系?请记住,我之前提到过:IOC的实施主要用三种技术:工厂模型,XML分析,反思。
春季IOC技术分析IOC容器实际上是一个大型工厂,管理所有对象和依赖项。
原则是通过Java反射技术实现!通过反射,我们可以获得所有信息(成员变量,类名等)!类别和类之间的关系是通过配置文件(XML)或注释来描述的。我们可以构建这些配置信息和反射技术来构建相应的对象和依赖性!让我们来看看实际的Spring IoC容器如何实现对象的创建和依赖性:
根据bean配置信息在容器内的容器中创建bean devile注册表根据注册表,实例化bean建立bean,在bean和bean之间建立依赖项将这些准备就绪的bean放在地图缓存池中,等待应用程序调用(1)Beanfactory春豆是典型的工厂模型。这一系列豆植物,即IOC容器为开发人员管理对象之间的依赖提供了大量的便利和基本服务,并为用户提供了许多IOC容器。选择和使用,其相互关联如下:作为界面类,BeanFactory定义了IOC容器的基本功能规范。最基本的IOC容器接口BeanFactory
公共类矩形实现形状{ @Override. public void draw(){ system.out.println(“internangle :: draw()方法”。); }}0只有IoC容器的基本行为在BeanFactory中定义,这不关心您的bean如何定义如何加载。随着我们只关心工厂的产品,它是工厂生产这些对象,这是这个基本界面并不关心。要知道工厂如何生成对象,我们需要查看特定的IOC容器实现,Spring提供许多IOC容器。例如,XMLBeanFactory,ClassPathxMlApplicationContext等(2)豆豆义法springioc容器管理我们定义的各种bean对象及其相互关系,并且Bean对象在Spring实现中以BeanDefinition描述。继承系统如下:Spring IoC的实现过程更复杂,并且可以研究相关的源代码。兴趣的学生可以下载源代码以查看Spring框架源代码
结论IOC不是技术,而是一个设计理念。在春季开发中,创建,初始化,IOC容器控制对象的销毁等。这还实现了对象控制的反转,并且对象的控制转换为对象上的弹簧IOC的控制。以上只是春天IO的观点和思考,欢迎讨论和文明沟通。
参考春天IOC了解“百度百科全书 - 控制反向工厂模式工厂模型Spring IoC最完整的源代码详细的Bean Instantial ProcessSpring5源代码分析(1)IOC和Spring Core容器架构春季IOC知识点摘要