IOC学习

Spring IoC源码学习:总览 前言 Spring 作为现在最优秀的框架之一,被广泛的应用于 Java 项目中,但是大多数人都只知道如何使用,而不知其中的原理。对大多数人来说可能知道如何使用已经足够了,但是对于想提升自己的人来说,学习 Spring 的源码是一个不错的选择。在过去的几个月里,我利用空闲时间将 IoC 的相关源码学习了一下,按照老习惯准备整理成笔记,以博文的形式记录下来,供自己以后使用,也供其他网友参考。由于涉及... 阅读详情

IOC前世今生

前些天,参与了公司内部小组的一次技术交流,主要是针对《IOC与AOP》,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更直观的来学习与理解IOC!也作抛砖引玉之用。

(虽说故事中的需求有点小,但看客可在脑海中尽量把他放大,想象成一个很大的应用系统)

 

一、IOC雏形

1、程序V1.0

话说,多年以前UT公司提出一个需求,要提供一个系统,其中有个功能可以在新春佳节之际给公司员工发送一封邮件。邮件中给大家以新春祝福,并告知发放一定数额的过节费。

经分析,决定由张三、李四和王五来负责此系统的开发。

其中:由张三负责业逻辑控制模块 LogicController的开发,此处简化为UT.LogicController.exe ;由李四负责祝福消息管理类(GreetMessageService),并集成到组件 UT.MessageService.dll中;由王五负责邮件功能帮助类(EmailHelper),并提供组件 UT.Email.dll。

类依赖关系如下:

021118402663083

 

李四消息管理模块核心代码如下:

张三业务集成模块核心代码如下:

三人经过一个月的艰苦奋战,终于大功告成,系统也在春节其间成功发出问候信。企业如此关怀,给员工带来无比的温暖,因此深受全体员工好评!

春节过后,相应的功能也移植到了与“UT公司”相关的“UT编辑部”和“UT房产”类似的应用当中,并在后继的“元宵”、“端午”、“中秋”等节日中得以广泛应用。

 

2、程序V2.0

又是一个年关将至……

说真的,过节费的多少,有时可能直接影响整个假日的行程安排、从而影响假日的整体质量,因此部门领导高度重视。而邮件通知的方式,在边远山区常常因为受网络环境的影响而无法正常收取,许多在外过年的同事对此颇有微词。后经多方考证,决得采用当下非常主流的电话语言播报的方式进行通知。

于是乎,张三、李四、王五又忙起来了。但李四,却有点头疼了,因为他的模块现在不仅在“UT公司”内部使用,而且还在“UT编辑部”和“UT房产”也都有独立运行。如何让此处变化影响最小,就得费点脑筋。为了达到较好的效果,李四决定按以下方式进行整改。

    ①、初始设计方案如下:

021120182039995

 

首先为了能让不同“祝福方式”能有效替换,决定以“面向接口”的方式来进行分离。同时,让EmailHelper的邮件通知类和TelephoneHelper的语音播报类都实现此接口。核心代码如下:

再者,为了方便兼容新旧产品,要求Controller决定当前采用什么方式进行通信,并以参数方式传给消息管理模块,核心代码如下:

【备注】:上述代码,并不是一个优秀的设计,在后继的优化方案当中将被去除。

【备注】:上述代码,并不是一个优秀的设计,在后继的优化方案当中将被优化。

 

最后,业务集成模块结合具体业务需求进行适当的调整,核心代码如下:

眼看即将完工,但李四却越看越不顺眼,因为考虑到以后可能再添加新的祝福方式,这种未来的不确定性,一定会让李四现有的枚举SendToolType和 GreetMessageService中的构造函数不断的进行更改,这将会是一个没完没了工作。

再说了,既然张三要传SendToolType给我,也就是说在具体产品应用时,张三的模块肯定是知道要采用什么方式进行祝福,那么何不让他直接把祝福方式的实例而不是简单的方式类型给我呢?这样,我不就省事了吗,于是乎把设计进行了优化。

   ②、优化后设计方案:

021120417194179

 

又是一个月的苦战……

王五的代码不受影响。

李四删除 SendToolType枚举,同进把GreetMessageService改成如下:

张三,也把业务逻辑控制部分改成如下:

最终:张三更新UT.LogicController.exe中的实现;李四更新了UT.MessageSevice.dll,王五提供新的组件:UT.Telephone.dll,并把接口集成到一个叫UT.Core.dll的库中。经多方集成测试后系统运行良好!

【点评】:

    李四此处成功的利用“接口分离”、并结合“依赖倒置”的方式,使得自己负责的模块初步具备了应对新增祝福方式的扩展要求。同时由于其采用的“依赖注入”方式要求李四的业务逻辑控制模块对其所需的 “ISendable”实例进行注入,理论上已经初步具体了“IOC反转控制”的雏形。

    对“IOC反转控制”此时带来的优势就是:确保了“红色框”内的模块是具有应对变化的能力,在后继新增新祝福方式时,UT.MessageService.dll组件可以完全不做任何修改。

 

3、V2.1

由于电话语言播报必须接听、过后不便留底查询等不足也常被人们诟病,因此短信通知的方式被提上议程。

在此要求下,王五提供了新的组件:UT.GSN.dll。核心代码如下:

张三也把代码改成了如下,

李四坐享其成!

 

4、V2.2

祝福方式日新月异人们的要求也是不断发展,没过多久短信方式太呆板、信息量不足等缺陷也暴露出来,微信深受大伙青睐。

在此要求下,王五提供了新的组件:UT.Wechat.dll。核心代码如下:

张三也把代码改成了如下:

李四再次坐享其成!!

二、IOC扩展

1、李四的逍遥自在与张三的焦头烂额

由于采用了IOC反转控制的思想,现在不管系统如何变化,李四负责的模块总的来说还是相当稳定,因此这些年李四过的可谓逍遥自在。然而,相比之下张三却因为产品在UT公司、UT编辑部、UT房产等都有独立应用,且各自使用的版本又不尽相同,因此要同时维护三个版本,可谓是焦头烂额。

当然张三曾经也想统一各个版本,从而实现代码的统一维护。为此还专门与各相关主管沟通过、协调过,然而由为UT编辑部与电信服务商早有合作所有短信免费,因此短信方式最得人心;而UT房产基于对信息接收者身份的特殊性考虑,邮件通知被认为是不二选择。因此,张三统一版本的梦想最终还是无果而终。

我们来看看此时的张三同时维护着三个系统,其中各自核心代码基本如下:

UT公司(微信方式)

UT编辑部(短信方式)

UT房产(邮件方式)

这些年,本着对工作和客户的认真负责,张三长时间在这些“版本维护”、“产品兼容”等脏活累活中摸爬滚打,现在是心力憔悴……

 

2、张三的出路

某日张三与李四觥筹交错、把酒言欢……

酒过三巡,张三对李四说:当年你的模块因“IOC反转控制”而脱身,却把“变化点”反转到我模块,由我来生成特定的对象,然后再向你注入。这样你是轻松了,但我却深陷泥潭……

 

面对张三的吐槽,李四只能给张三进行细心分析:

首先、MessageService消息管理模块作为一个消息专用服务,其实对“是采用邮件还是微信方式进行祝福”这样的功能性把控本身是不具主动权,由这个模块来负责实在是有点鞭长莫及,即便强扭到一起,这瓜也铁定甜不了。

还有,本着单一职责的原则本消息服务其实是不方便过多地去处理本应该是业务逻辑处理的类似“选择祝福方式”这种事情。理论上,作为业务集成方的“LogicController”负责处理这类业务应该是责无傍代。

再者,作为新增需求,王五为此而新增组件(dll)那是必不可少;张三作为业务的总集成方也是难以脱身;由于新增需求而引起的变化,对张三和王五产生影响也是情理之中。即便退一万步来说,就算没有“反转控制”张三也是要面对变化的(就像V2.0初始方案中的传入SendToolType参数),因此有无“反转控制”对张三而言该变的始终还是要变化。那么现在采用“IOC反转控制”而成全了李四的稳定,对张三来说这是个“利人不损已”的买卖。

最后,不管从架构设计还是开发效率上来说,“IOC反转控制”虽说把变化点从李四的“MessageService”模块反转到了张三的“LogicController”模块当中,但这符合“SOLID面向对象设计”的原则,可以说是一个好的设计,本无可厚非!

听完李四的论述,张三觉得甚是有理,酒不免醒了三分!由于两人都是这个行业打拼多年的老鸟,争论也是点到即止。马上把交流的重点转移到“如何解决张三同时维护三个产品”的尴尬处境上来。

经过深入分析,两人觉得要脱困必须解决好如下两个问题:

①:如何有效创建“ISendable”实例,减少由于新增祝福方式对实例创建的影响?

②:如何减少新增祝福方式而对“LogicController”模块的冲击,以减少维护成本?

【备注】

     SOLID面向对象的五个设计原则对于开发人员非常重要,其身影在任何大中型软件项目中随处可见,建议必须掌握并灵活应用。此五原则分别为:

    单一职责原则(Single Resposibility Principle)

    开放封闭原则(Open Closed principle)

    里氏替换原则(Liskov Substitution Principle)

    接口分离原则(Interface Segregation Principle)

    依赖倒置原则 (Dependency Inversion Principle)

 

3、解决方案

为了实现“如何有效创建ISendable实例”的问题,张三引入了“工厂模式”,由于不同的祝福方式而产生的变化,封装在一个独立的“SendToolFactory”类中,这样就算以后再有变化,只要更改此类中部分代码即可,而不影响程序中其他所有用到ISendable的地方。

【点评】:

以工厂模式来实现“ISendable”对象实例的创建,是一种典型的“高内聚”与“松耦合”的设计方式,它有效的使得应用程序核心部分并不用去关心系统到底采用了什么样的“祝福方式”,而具体的“祝福方式”则在工厂模式内部进行创建。如果以后需求有变动,那也只需在工厂做少许修改即可,程序其他代码都将不受影响。

当成功解决完第一个问题后,我们立即拉开针对“如何能实现在新增祝福方式之后,有效的控制对“LogicController”模块的冲击”这们问题上来。从目前程序的结构来看,在新增祝福方式之后的主要冲击有两方面:首先是更改工厂类中的代码用以创建新的实例;再者是引入新的动态库。

最后我们决定采用“工厂模式+反射机制”的方式来解决上述难题,并在工厂模式中依靠配置文件的节点信息,然后采用“反射机制”来动态创建相应的实例;如此一来,以后就算再有新的祝福方式采用,也只需把王五新增的动态库拷贝过来,然后再更改一下配置文件中的节点信息就行,不再需要更改任何程序源代码,也不再需要重新编译生成程序。

 

4、程序V3.0

采用工厂模式创建实例

工厂中的实现

配置文件节点信息

自从V3.0推出后,基于“IOC反转控制”的思想也算小有收获,多年来产品运行良好,就算不断有新的“祝福方式”出现,张三和李四也都不必再为之操心,同时也能适用“UT公司”、“UT编辑部”和“UT房产”等不同的场景要求,可谓皆大欢喜。

【点评】:

①:IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入、Setter注入和构造函数注入。本次示例给出的代码具备“接口注入”的特征,并通过构造函数来实现。

    ②:IOC反转控制还有一种手段就是依赖查找,这种方式一般先进行类型注册,使用时进行查找;对这种方式有兴趣的朋友可以参考微软企业库中Microsoft.Practices.Unity.dll中的源码(https://entlib.codeplex.com/)和详细的示例说明整理(如:Enterprise Library 4.1 HOL)。

     ③:依赖注入一般由调用者(LogicController)依赖IOC框架生成好实例对象,然后直接注入到被调用者(GreetMessageService)当中,被者用者内部直接使用此实例,代码流程清晰明了;而依赖查找一般由调用者(LogicController)前期进行类型注册,被调用者(GreetMessageService)内部依赖IOC框架获取到想要的对象实例,然后再使用此实例。

    ④:两者生成实例的目的都是为了能动态创建实例,只不过创建的时机不一样。我个人认为依赖注入分离了逻辑控制相对来说层次性更清晰明了,但在需要注入多个对象时,却不及查找注入方式方便简洁。

 

三、IOC框架

1、模式的复用

自从张三在上述产品开发过程中成功地总结出“IOC思想”后,在后继的其他产品中进行了推广与实践。在使用的过程中,张三发现这样的模式是可以很好的在模块间、产品间进行有效的复用,不仅大大提高了开发效率,对产品后继的扩展和维护都带来不少方便。

 

2、对象容器

当然,在对“IOC思想”的实践中,张三还发现有些地方需要完善。比如,有时我们可能要创建单一对象实例,有时却要要创建多个对象的实例,甚至有时要创建一系列实例;有时要创建一个本地的对象实例,有时却要创建一个远端的服务对象实例;等等…..

为了应对复杂的对象应用,张三把原来的“对象工厂”这样的小作坊升级成了一个功能强大的、具有一定智能水平的“IOC对象容器”,这个容器可以动态的依据参数设定或配置文件来进行有策略性的对象创建与管理,使得整个框架对对象集的管理上升到了一个更高的层次。

 

3、IOC基础框架

张三通过前期的“接口分离”及“依赖倒置”达到了“反转控制”的效果,并结合有效的“依赖注入”方式,实现了系统的“松耦合”架构;再通过“工厂模式 + 反射机制”有效实现了对象的动态创建,并在后期升级成“对象容器”,大大减少新增需求对程序带来的冲击。通过以上方式,张三成功地摸索出一套行这有效且复用性高的“IOC基础框架”。

 

4、IOC思想

后来,张三把摸索总结出的“IOC基础框架”在公司各产品中进行了广泛实践,得到一致好评,并且被作为一个公共组件集成在一个叫“UT企业库”的组件集中。从此,在张三的朋友圈中,IOC思想广为流传。

若干年后,我们发现EJB、Spring、Struts、Asp.netMVC等框架中都能看到IOC思想的影子,这些框架都对张三最初IOC的思想作了进一步的发扬、光大。

现在,IOC的思想在软件设计与系统架构中大放异彩,然而非常遗憾中国人口中的那个神秘的张三至今也不知到底是谁。

C# IOC与AOP框架学习指南 C#(发音为 “C Sharp”)是一种由微软公司开发的现代、面向对象的编程语言,它是.NET框架的核心语言,专门设计用来开发各种类型的应用程序。C#语言继承了C和C++的语法,同时也包含了来自其他语言的特性,比如Java的异常处理和Visual Basic的属性。控制反转(Inversion of Control,简称IOC)是一种设计原则,通过依赖注入(Dependency Injection,简称DI)等技术,将传统对象的创建和调用过程反转,由外部环境在运行时决定具体的对象。 阅读详情

相关推荐

简单了解SPRINGIOC的底层原理演变过程

主要介绍了简单了解SPRINGIOC的底层原理演变过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

【调侃】IOC前世今生

http://blog.jobbole.com/76510/ 前些天,参与了公司内部小组的一次技术交流,主要是针对《IOC与AOP》,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更直观的来学习与理解IOC!也作抛砖引玉之用。 (虽说故事中的需求有点小,但看客可在脑海中尽量把他放大,想象成一个很大的应用系统) ...

diaoju3333的博客 206

【Unity】入门教程第一期-下载安装Unity编辑器(下)

讲解如何在Unity Hub中下载Unity编辑器以及IED环境

Xiaoxin的博客 2041

【死磕Spring】| Spring IoC依赖查找:依赖注入还不够吗?依赖查找存在的价值几何?

文章目录Spring IoC依赖查找:依赖注入还不够吗?依赖查找存在的价值几何?00、代码实现参考包的路径01、根据Bean名称进行查找1.1、实时查找1.2、延迟查找02、根据Bean类型进行查找2.1、单个Bean对象2.2、集合Bean对象03、根据Java注解查找 Spring IoC依赖查找:依赖注入还不够吗?依赖查找存在的价值几何? 00、代码实现参考包的路径 1、DependencyLookUpDemo.java 2、User.java 3、SuperUser.java 4、context-

MarkusZhang的博客 281

Cocos Creator+微信小游戏:如何用wxDownloader实现资源动态加载与热更新

本文深入探讨了在Cocos Creator开发微信小游戏时,如何利用wxDownloader有效应对主包体积限制,实现资源的动态加载与热更新。文章详细介绍了从项目配置、资源标记到初始化加载的完整流程,并重点解析了基于MD5 Cache的缓存策略与版本控制方案,旨在帮助开发者构建稳健高效的资源管理体系,优化游戏启动速度与更新体验。

css33的专栏 823

TwinCAT 3 实战:手把手教你用PLC和C++读写第三方伺服驱动器的CoE参数

本文详细介绍了在TwinCAT 3环境中通过PLC和C++两种技术路线实现对第三方伺服驱动器CoE参数的精准操控。从环境准备到具体实现,包括硬件配置、核心函数使用及性能优化策略,为工程师提供了全面的实战指南。特别针对CoE参数访问的效率和稳定性问题,给出了实用的调试技巧和异常处理方案。

weixin_33743248的博客 444

IOC前生---采用工厂设计模式

IOC前生---采用工厂设计模式

上善若水 380

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

DI,DIP,IOC的演变历史

此随笔的重点在“Demo分析”一章,以代码的分阶段变化讲述了DI,DIP,IOC的演变,写在前面文字均为铺垫。 希望各位园友拍砖,促使流浪者的进步,现在有很多问题想讨论,即以此文寻找志同道合的园友,另此文草草写作,发现越写越觉得还有很多没有描述出来,暂且如此,等待过些时日再来总结,草草之作难免有错误之处,忘各位园友斧正,不甚感激! 先来个简介,看不懂没关系,按着顺序看下去等Demo看完就明白了...

weixin_30507269的博客 303

人工智能训练师三级考试题型全解析|190道真题样例+30天备考路线

人工智能训练师三级考试并不神秘:理论考190道选择题(刷题就能过),实操考代码+方案设计(练练就会)。核心是花时间——30天系统备考,足以从容通过。如果你想从零开始系统备考,覆盖所有考点和实操技能,欢迎查看我的专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程六大模块知识点逐个击破,每个考点都讲透实操代码题手把手教学,附带完整参考代码高频考点速记 + 易错题精讲 + 3套模拟试卷30天备考计划 + 冲刺复习策略。

白话机器学习 6081

IEEE S&P 2026 大模型安全论文整理

本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。

CSPhD-winston的博客 1335

3.Spring IOC发展史

1.通过new来获取对象 Student student = new Student(); student.setXxx(); 2.通过简单工厂来获取对象 3.通过IOC(超级工厂)获取对象 4.控制反转的解释 (1)IOC(控制反转)也可以称之为DI(依赖注入) (2)控制反转 将创建对象、属性值的方式进行了翻转,从new、setXxx()翻转为了从Spring IOC容器getBean() (3)依赖注入 将属性值注入给了属性,将属性注入给了bean,将bean注入给了IOC容器 (4)总结 IOC/D

123 256

『Apisix进阶(九)』基于Upstream实现服务转发的最佳实践

本篇文章将以服务转发为核心,带你从原理到实战,深入了解 Upstream 的配置方法与常用场景。

老陈聊架构 1515

spring源码学习总结1-IOC

学习spring源码的过程,就是开始,放弃,再开始,再放弃,再开始。。。的过程 最近准备把学习到的spring内容整理下,先从IOC开始,来张思维导图, 暂时学习到的IOC内容就是下面这些,后续会根据这张图来整理下之前的学习笔记,然后发出来。 ...

qq_39172525的博客 202

Java Swing教程-16. Swing中的图形绘制

这篇教程介绍了Java Swing中的图形绘制功能,主要内容包括: Graphics类的基本使用 - 介绍了如何重写paintComponent方法实现自定义绘制,以及基本图形绘制方法(线条、矩形、椭圆、多边形等) 文本与图片绘制 - 讲解了文本绘制方法、字体设置和图片加载绘制技术 颜色与字体设置 - 包括预定义颜色、RGB自定义颜色、透明色设置以及字体样式控制 案例实现 - 提供了一个简单绘图程序的框架,支持鼠标绘制不同图形、选择工具和自定义颜色等功能 教程通过代码示例详细演示了各种绘图操作,适合Java

无 233

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring源码学习-IOC(xml方式获取注册BeanDefinition)

为什么写这篇文章   用了这么长时间的Spring框架,对于如何配置使用是了然于胸,但是问到为什么就一脸懵逼了。所以最近开始学习Spring源码,网上对于Spring源码分析也有非常多的资料,学习的时候也有做过一些参考。但别人的东西永远是别人的,只有自己真正去看过理解了,才能成为自己的。写这个也是为了加深自己的理解。 概念理解   概念理解这部分分享的是Iteye的开涛这位技术牛人对Spring框...

weixin_34055787的博客 166

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

反射学习之——IOC小案例

https://www.jianshu.com/p/881dff233d43

qq_37176833的博客 173

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

spring ioc容器原理学习

Spring Framework 开发参考手册.chm 一、IOC核心理论回顾 知识点: Ioc理念概要 实体Bean的创建 Bean的基本特性 依赖注入 set方法注入 构造方法注入 自动注入(byName、byType) 依赖检测 1、Ioc理论概要 在JAVA的世界中,一个对象A怎么才能调用对象B?通常有以下几种方法。 类别 描述 时间点 ...

工学院的博客 489

IOC学习之路

IOC

tanx的博客 501

Spring-学习笔记05【基于XML的IOC的案例】

Spring-学习笔记05【基于XML的IOC的案例】

upward 1186

Spring Ioc学习

Spring 是目前主流的 Java 开发框架,是 Java 世界最为成功的框架。其目的是用于简化企业级应用程序开发的难度和周期,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。什么是框架?框架是一个半成品,提供了基本的运行功能,但具体业务实现需要我们去编写。

qq_18879887的博客 1064

IoC学习

Spring学习记录,IoC学习。

撰写Bug 322

IOC学习总结

容器启动IOC学习总结

u011523825的博客 436

项目架构MVC,IoC,DI【学习笔记】

本文手动实现一个类似 next.js 的 MVC 架构,实现 IoC控制反转和 DI依赖注入。

我的小鱼干呢! 1135

Spring IoC源码学习:obtainFreshBeanFactory 详解

前言 上文Spring IoC:ApplicationContext 刷新前的配置介绍了refresh 方法前的环境准备操作,接下来正式进入 refresh方法。prepareRefresh是refresh里的第一个方法,主要是一些准备工作,比较简单的方法,看一下就了解了。接下来是obtainFreshBeanFactory方法,该方法用于获得一个新的 BeanFactory,本...

程序员囧辉 1万+

Spring IOC学习计划

太偏门的就不钻牛角尖了,东西太多也学不过来。主要学习一下IOC的设计理念,Spring基本的框架执行流程,以及项目中常用的注解、配置、使用方式等。暂定按下图的计划来学习。过程中也会逐渐补充这个图。现在知识还很少,肯定有不完善甚至错误的地方,以后碰到再来修正。

pur_e的专栏 908
上一篇: IP地址修改后ORACLE不能使用问题
下一篇: jenkins 构建分发
andycode
博客等级 码龄17年 12粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值