【设计模式】依赖倒置原则与工厂方法模式与spring
目录
一、引言:
二、概述:
三、举例:
“简单工厂”:
依赖倒置:
四、问题来了
五、在spring中
一、引言:
设计模式的六大原则有:
Single Responsibility Principle:单一职责原则
Open Closed Principle:开闭原则
Liskov Substitution Principle:里氏替换原则
Law of Demeter:迪米特法则
Interface Segregation Principle:接口隔离原则
Dependence Inversion Principle:依赖倒置原则
把这六个原则的首字母联合起来(两个 L 算做一个)就是 SOLID (solid,稳定的)。六大原则是设计模式的基石,这篇文章中,我们来看一下依赖倒置原则。
二、概述:
依赖倒置原则是:
1、高层模块不应该依赖低层模块。两个都应该依赖抽象;
2、抽象不应该依赖细节。细节应该依赖抽象;
三、举例:
以《大话设计模式》中,大鸟要求小菜实现计算机加减乘除功能为例
“简单工厂”:
运算类 Operation
public class Operation {private double numberA = 0;private double numberB = 0;public double getResult() {double result = 0;return result;}public double getNumberA() {return this.numberA;}public void setNumberA(double numberA) {this.numberA = numberA;}public double getNumberB() {return numberB;}public void setNumberB(double numberB) {this.numberB = numberB;}}
加法类 OperationAdd
public class OperationAdd extends Operation {@Overridepublic double getResult() {double result;result = getNumberA() + getNumberB();return result;}
}
减法类 OperationSub
public class OperationSub extends Operation {@Overridepublic double getResult() {double result;result = getNumberA() - getNumberB();return result;}
}
乘法类 OperationMul
public class OperationMul extends Operation {@Overridepublic double getResult() {double result;result = getNumberA() * getNumberB();return result;}
}
除法类 OperationDiv
public class OperationDiv extends Operation {@Overridepublic double getResult() {double result;if (getNumberB() == 0) {System.out.println("除数不能为0");return 0;}result = getNumberA() / getNumberB();return result;}
}
简单工厂类 OperationFactory
public class OperationFactory {public static Operation createOperate(String operate) {Operation oper = null;switch (operate) {case "+":oper = new OperationAdd();break;case "-":oper = new OperationSub();break;case "*":oper = new OperationMul();break;case "/":oper = new OperationDiv();break;}return oper;}
}
main 方法
public static void main(String[] args) {Operation oper;oper = OperationFactory.createOperate("+");oper.setNumberA(1);oper.setNumberB(2);double result = oper.getResult();System.out.println(result);}
在这段代码中,可以看出,实现加法功能,加法工厂(高层)需要调用加法实现(低层),在main方法中,通过传入“+”,在工厂中生成实现类。此时如果增加“求平方”的功能。添加子类的同时,需要修改OperationFactory类。上层依赖下层实现。
依赖倒置:
使用依赖倒置原则,试着解决下这个问题。以工厂方法模式为例:
在“简单工厂”的基础上,加上抽象工厂。
抽象接口:IFactory
public interface IFactory {Operation createOperation();
}
加法工厂类:AddFactory(实现抽象接口)
public class AddFactory implements IFactory{@Overridepublic Operation createOperation() {return new OperationAdd();}
}
减法工厂类: SubFactory(实现抽象接口)
public class SubFactory implements IFactory {@Overridepublic Operation createOperation() {return new OperationSub();}
}
乘法工厂类:OperationMul(实现抽象接口)
public class MulFactory implements IFactory {@Overridepublic Operation createOperation() {return new OperationMul();}
}
除法工厂类:DivFactory(实现抽象接口)
public class DivFactory implements IFactory{@Overridepublic Operation createOperation() {return new OperationDiv();}
}
main 方法:
public static void main(String[] args) {IFactory factory = new AddFactory();Operation oper = factory.createOperation();oper.setNumberA(1);oper.setNumberB(2);double result = oper.getResult();System.out.println(result);
}
加入工厂方法模式,最直观的感受是:代码多了。
从main方法可以看出,工厂(高层)不直接调用具体的子类(低层),而是工厂和子类都依赖抽象接口,工厂只需要调用抽象接口,将具体实现延迟到了子类。此时如果增加“求平方”的功能,只需要新增实现类,实现抽象接口IFactory即可。实现了依赖倒置。
四、对比
1、工厂方法中,父类依赖抽象不依赖具体,那在哪里决定生成哪个子类?
换句话说:IFactory factory = new AddFactory();
main方法中的这段代码,应该写在哪里?
答案是,这段代码,可以任何形式由调用者传入,可以写在具体调用者的事件下,也可以写在配置文件中。调用者只需“告诉”程序要实现什么功能,具体交给子类实现。
2、两种方式都能实现功能,使用依赖倒置的好处是什么?
1)高层和低层都依赖抽象,低层修改不影响高层,实现解耦合,增加了低层的可扩展性;
2)高层仅需考虑调用哪个接口,无需关注具体实现,由低层实现,低层功能内聚;
五、在spring中
IFactory factory = new AddFactory();
其实,这段代码,spring帮我们实现了。spring的IOC容器就是工厂,生成各种功能工厂,高层根据功能选择生成哪个工厂。低层是实现类bean,可通过配置,注解等方式,注入到工厂中。高层通过反射从spring工厂中获取bean;bean依赖spring容器,注入到容器中,交给容器管理。spring IOC容器,将调用和实现解耦,使高层和低层都面向了spring IOC容器。
相关文章
- C#调用Delphi的dll之详解-完整版_附有可下载Demo
注:本文源代码点此下载 c#调用delphi接口方法,有两种解决办法: 一、将delphi程序编译成一个com组件,然后在c#里引用com组件。 二、非托管调用dephi的dll文件。 这里我们主要讲解一下第二种方法,讲第二种方法之前首先讲解下dllimport。 dllimport是system.runtim…...
2023/3/28 17:09:32 - Sqoop -error- ERROR tool.ImportTool: Import failed: java.io.IOException: No columns t generate for C
利用sqoop从mysql导入hive报错如下: 21/05/17 21:54:07 ERROR tool.ImportTool: Import failed: java.io.IOException: No columns t generate for ClassWriter at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1677) at org.apach…...
2023/3/28 17:09:32 - Delphi之OOP面向对向模型------『Delphi园地』
注:本文源代码点此下载 delphi对于面向对象编程的支持丰富而且强大。除了传统的类和对象,delphi还提供了接口,异常处理,多线程编程等特性。这一章节深入讲解了delphi的对象模型。读者应当对标准的pascal比较熟悉,并且对有关面向对象编程的基本法则有一定了解。 (本…...
2023/3/28 17:09:31 - 解决Nginx启动报nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
执行命令 openresty -p /opt/app/collect-app/ 启动openresty 出现以下错误: 错误原因:出现这种情况一般是80端口被占用了 解决办法: 法一: sudo fuser -k 80/tcp -- 执行此命令,将进程杀死后,启动ngin…...
2023/3/28 17:09:31 - 解决fuser命令不存在-fuser:command not found
解决办法:使用yum源安装即可 yum install -y psmisc 再次执行 fuser -k 80/tcp 就OK了...
2023/3/28 17:09:30 - 浏览器加载和渲染html的顺序
注:本文源代码点此下载 前阵子,在组内给大家做了一次关于“浏览器加载和渲染html的顺序”的分享,这里再总结一下吧。 1.浏览器加载和渲染html的顺序 1、ie下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。 2、在渲染到页面的某一部分时,其…...
2023/3/28 17:09:30 - Hive -- 时间戳转日期需要/1000的解释
hive中的时间戳转日期的函数为: from_unixtime(BIGINT unixtime,STRING format) 首先这里我要说一下,这里的unixtime的输入单位十秒,也就是十位的BIGINT。 但是呢,在我们实际中用的时间戳一般都是十三位的时间戳,精确…...
2023/3/28 17:09:29 - Delphi研究之驱动开发篇(四)
注:本文源代码点此下载 通过对前面几篇教程的学习,相信大家已经掌握了一些用delphi开发windows驱动程序的基础知识,从现在开始我们来了解一些必要的底层技术,首先我们要了解的就是内存管理方面的知识。 内存管理器给用户进程提供了大量的api。这些api可以分为三类:…...
2023/3/28 17:09:29 - Hive -- 常用的hive查询函数
1、get_json_object()函数 get_json_object(STRING json_string, STRING path) 说明:如果其中一个字段数据为json格式的字符串,但实际上的需求是获取json格式字符串中的一个属性的值,那么,就需要用到此函数了。 { "targe…...
2023/3/28 17:09:28 - AJAX请求类
注:本文源代码点此下载 ajax请求类 作者:hotheart 时间: 2006-08-28 文档类型:原创 来自:蓝色理想 在给blog加上无刷新搜索和即时验证检测后,又看了下代码,感觉太过麻烦,就把xmlhttprequest请求封装到一个类里面,用起来方便多了,不用记那么多代码,什么创建xmlhttp…...
2023/3/28 17:09:27 - flume采集出现com.alibaba.fastjson.JSONException: syntax error, pos 1, line 1, column 2��-�
采集后数据后,投递到hdfs上时出现以下错误: 2021-05-26 11:44:44,103 (pool-5-thread-1) [ERROR - org.apache.flume.source.SpoolDirectory Source$S…...
2023/3/28 17:09:27 - 从HTML1到HTML5,HTML发展历史介绍【转载】
注:本文源代码点此下载 html 是 web 同一语言,这些容纳在尖括号里得大略标签,构成了如今得 web。1991 年,tim berners-lee 编写了一份叫做 “html 标签”得文档,内里包括了大约20个用来标记网页得 html 标签。他直接借用 sgml 得标记款式,也便是其后我们看到得 html…...
2023/3/28 17:09:26 - 创建redis集群报错:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require‘: cannot load suc
执行创建集群命令: redis-trib create --replicas 0 192.168.1.101:7003 192.168.1.101:7001 192.168.1.101:7002后会出现报错如下: /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in require: cannot load such file -- redis (LoadErro…...
2023/3/28 17:09:26 - 总结22 -- Linux /usr/bin与/usr/local/bin的区别
说明:最近突然迷惑了/usr/bin与/usr/local/bin存放的不同,故查阅了资料稍微总结了下 区别: /usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变。/usr/local/bin目录是给用户放置自己的可执行程序的地方,推…...
2023/3/28 17:09:25 - java和python常用方法对比
注:本文源代码点此下载 java和python常用方法对比 用惯了python,用java写代码感觉有些煎熬的感觉,似乎比python要罗嗦很多。主要还是因为java属于强类型的语言,它的动态性不如python。但其实基本的东西都差不多。 所以想把python和java常用的一些方法罗列一下,同时…...
2023/3/28 17:09:25 - redis--redis常用指令、命令行操作、jedis客户端连接两种方式、redis基本数据类型、redis持久化方式、redis伪分布式集群搭建
目录 一、redis客户端的常用指令 二、命令行操作 三、redis客户端API操作 1、添加依赖 2、单机连接 3、连接池连接 四、redis数据类型 1、五种数据类型 2、其他操作 五、持久化操作 1、RDB方式 2、AOF方式 六、redis集群搭建 redis伪分布式集群搭建 一、redis客户端的常用…...
2023/3/28 17:09:24 - ajax loading 总结
注:本文源代码点此下载 1. 使用timer multiview, 先显示view1, 待timer中的执行完成之后,再显示view2即可. view1即loading提示内容,view2为真正要显示的内容. 可以针对整个页面使用.如果view2中的内容显示失败,则显示view3(错误提示), 通过模拟btn_click,这样在p…...
2023/3/28 17:09:24 - 写在Delphi 2010发布之际
注:本文源代码点此下载 2009.8.25 delphi 2010发布了,从官方的资料看,增加(强)了许多新的特性,比如unicode,匿名方法、泛型支持、反射、多线程debug等,datasnap也有 了很大的改变:可以脱离对com的依赖,通过json传递数据,支持http/https/tcpip等协议,支持轻量级callb…...
2023/3/28 17:09:22 - 【大数据开发】Java基础-总结22- java执行static代码块、构造块与构造方法的顺序
1、总结如下: 1、Java中静态变量只能在类主体中定义,不能在方法中定义。 2、静态变量属于类所有而不属于方法。 3、静态块:用static申明,JVM加载类时执行,仅执行一次。 4、构造块:类中直接用{ }定义&#x…...
2023/3/28 17:09:22 - 总结1 -- scala中的isInstanceOf和asInstanceOf区别
区别: 1、若是想判断对象是否属于某个给定的类 -- 使用isInstanceOf方法 2、若是想进行类似于java中的强制转换 ,那么就是用asInstanceOf方法,用asInstanceOf方法将引用转换为子类的引用。 进一步说明: obj.isInstanceOf[T]就如…...
2023/3/28 17:09:20 - java transient 简介
注:本文源代码点此下载 我们都知道一个对象只要实现了serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了serilizable接口,这个的所有属性和方法都会自动序列化。 然而在实际…...
2023/3/28 17:09:20 - 总结23 -- linux上时间同步服务器的搭建
一、检查ntp是否安装 1、查看是否安装ntp 命令如下:rpm –qa | grep ntp 若只有ntpdate而未见ntp,则需删除原有ntpdate。比如: ntpdate-4.2.6p5-22.el7_0.x86_64python-ntplib-0.3.2-1.el7.noarch 2、删除已安装的ntp 命令如下:…...
2023/3/28 17:09:19 - HTML语言参考(1)
注:本文源代码点此下载 html语言参考(1) 1. html 标 签 这 些 标 签 用 于 建 立 具 有 文 本、 标 题 和 列 表 的 html 页 面。 1.1 注 释 〈! --...-- 〉生 成 注 释 1.2 结 构 标 签 〈 html 〉 ... 〈 /html 〉 括 住 整 个 html 文 档。 可 以 包 含:〈…...
2023/3/28 17:09:19 - Asp.net ajax、Anthem.net、Ajax pro三大ajax框架那一种使用比较方便?易于配置?
注:本文源代码点此下载 asp.net ajax、anthem.net、ajax pro三大ajax框架那一种使用比较方便?易于配置? 2009-08-11 10:01 by 汉卿, 114 visits, 收藏, 编辑 asp.net ajax为asp.net 3.5的默认支持的ajax框架,在功能上、开发工具支持上、文档的完备性方面来…...
2023/3/28 17:09:18 - Scala -scala基础- 编码规范、变量和常量定义与区别、类型层级关系
目录 scala基础 1、编码规范 1.1、文件名和编码 1.2、代码书写规范 2、scala变量和常量的定义 2.1、val和var 2.2、val和var的区别 2.3、可变与不可变的理解 2.4、延迟加载 3、类级层级关系 scala基础 1、编码规范 1.1、文件名和编码 # 源文件名必须和它包含的顶层类名保持…...
2023/3/28 17:09:17 - 让您的Ajax应用加载数据时界面友好
注:本文源代码点此下载 让您的ajax应用加载数据时界面友好 让您的ajax应用加载数据时界面友好 ajax火啊,火到了居然loading icons都有很多人专门提供的地步。下面是我同事给我介绍的一些提供ajax activity indicators的网站,共享给大家,以便让我们的ajax应用具有更…...
2023/3/28 17:09:17 - 【大数据开发】Java基础-总结23-java中的static变量、static方法、static执行顺序总结
说明:最近想到了static代码块、普通代码块与构造函数的执行顺序,故经过试验了一下,写了一下总结,以防自己再次遗忘;另外,也顺便查阅资料,总结了下日常对static方法、static变量的说明。 1、stat…...
2023/3/28 17:09:16 - JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法
注:本文源代码点此下载 1、如何将java.util.date转化为java.sql.date? 转化: java.sql.date sd; java.util.date ud; //initialize the ud such as ud new java.util.date(); sd new java.sql.date(ud.gettime()); 2、如果要插入到数据库并且相应的字段为d…...
2023/3/28 17:09:16 - Scala -scala进阶- 高阶函数的初次体验
目录 高阶函数 1、高阶函数的定义 2、常见的高阶函数 3、常见高阶函数的代码示例 3.1、filter函数 3.2、foreach函数 3.3、map函数 3.4 reduce函数 3.5 flatMap函数 3.6 flatten 函数 高阶函数 1、高阶函数的定义 定义:如果一个函数的传入参数为函数或者返…...
2023/3/28 17:09:15 - Javascript学习笔记12——Ajax入门
注:本文源代码点此下载 刷新评论列表刷新页面返回页首 发表评论 昵称: [登录] [注册] 主页: 邮箱:(仅博主可见) 验证码:看不清。 换一个 评论内容: 记住我的昵称和主页 --> 登录注册 [使用ctrlenter键快速提交评论] 0 1650229 hjltxm9ccy0…...
2023/3/28 17:09:14
最新文章
- 使用 Flash Builder 的 Apple iOS 开发过程
使用 Flash Builder 的 Apple iOS 开发过程 iOS 开发和部署过程概述 构建、调试或部署 iOS 应用程序前的准备工作 在测试、调试或安装 iOS 应用程序时选择的文件 将应用程序部署到 Apple App Store 时选择的文件 在使用 Flash Builder 开发 iOS 应用程序之前,必须…...
2023/3/16 19:40:03 - exchange日常管理之九:升级SP1后的灾难恢复
将exchange 2007升级到了exchange 2010,但是没有打最新的SP1补丁和累积更新,没想到这补丁一打就出问题了,汗了一把啊。 升级过程摘要 1、在前端服务器和后端服务器上安装microsoft office filter pack 2.0 2、停掉后端的beremote备份进程 3…...
2023/3/16 17:29:51 - iOS开发 - js oc相互调用
2019独角兽企业重金招聘Python工程师标准>>> 首先导入 JavaScriptCore.framework 框架 #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import <JavaScriptCore/JavaScriptCore.h>protocol ServerJSProtocol <JSExport>// 微…...
2023/3/16 6:11:48 - git学习之创建版本库
创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪…...
2023/3/16 5:38:29 - List集合中的数据按照某一个属性进行分组
有的时候,我们需要在java中对集合中的数据进行分组运算。例如:Bill对象有money(float)和type(String)属性,现有个集合List<Bill>,需要按照Bill的type属性进行分组,计算money的总和。有以下两种思路: …...
2023/3/18 2:30:34 - 游戏编程性能优化--------------------------------------------------------------------------------------...
游戏编程性能优化------------------------------------------------------------------------------------------- 1.全局变量名尽量用缩写,尽可能短,可以减小程序最终生所的体积 2.for循环在较大的循环空间,写成几个循环,以利用…...
2023/3/16 12:35:44 - 2017年软件工程作业-“Hello World!”团队互评beta版本
A.欢迎来怼——博客园安卓APP(测评人:刘淑霞) 博客地址:http://www.cnblogs.com/liusx0303/p/7905928.html B.Thunder——爱阅app(测评人:方铭) 博客地址:http://www.cnblogs.com/…...
2023/3/16 12:07:11 - ibatis 批量插入逻辑
为什么80%的码农都做不了架构师?>>> ibatis oracle 批量插入配置 <!--批量新增--><insert id"CreateLawStatisticsClassifyBatch" parameterClass"ArrayList">insert into T_LAW_STATISTICS_CLASSIFY(ID,TEMPLATE,ALIA…...
2023/3/16 5:39:32 - secureCRT免密码登陆Linux
转自:http://blog.csdn.net/wangquannetwork/article/details/46062675 1.实现原理: 通过CRT生成的密钥对,把公钥上传到Linux服务器指定用户下的.ssh目录中,在客户端上只需输入秘钥的密码即可登陆,而且验证一次以后可以…...
2023/3/16 11:10:31 - PP代码生成器(二) 解决方案, 生成任务, 辅助设计面板
我们接着上一篇博客继续讨论如何使用PP生成代码. 首先, 我们介绍两个概念”解决方案”和 “生成任务”. 解决方案: 解决方案是一系列生成任务的集合. 它包含若干个生成任务.生成任务: 每个任务会关联一个freemarker模板, 最终会使用这个模板来生成一个结果文件解决方案和任务的…...
2023/3/16 10:41:54 - 函数的运用二(一个一个字读,便于学会机率)
看完前篇的函数运用是不是不在疑惑,那么下面就来点复杂一点的,也不难的。 如下图所示:读绿色和黄色注释。 是不是能写出来了,调用函数的方式,都是一样的。跟上面前篇的调用几乎一样的,不同就是函数名不同而…...
2023/3/24 2:33:26 - 困扰你的Git操作?
前端学习笔记篇之git那些事 Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。学习前端,离不开Git的使用,面试时也是一个常考的话题,在日常开发中,也困扰我们许久,下面就让…...
2023/3/24 2:33:28 - ArrayList和LinkedList的区别
2019独角兽企业重金招聘Python工程师标准>>> ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。 LinkedList使用了…...
2023/3/16 17:29:27 - Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程...
在上篇随笔《Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示》中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的《winform开发框架》的基础上进行CRM系统模块的开发工作,希望对大家在系统模块开发…...
2023/3/16 5:37:14 - shell 日期加减运算
比如今日是2012-04-22$ date -d "1 day" %Y-%m-%d2012-04-23$ date -d "-1 day" %Y-%m-%d2012-04-21$ date -d "2012-04-10 -1 day " %Y-%m-%d2012-04-09$ date -d "2012-04-10 1 day " %Y-%m-%d2012-04-11$ date -d "-1 week &q…...
2023/3/15 19:12:30 - PHP 字符串替换 substr_replace 与 str_replace 函数
PHP 字符串替换 用于从字符串中替换指定字符串。 相关函数如下: substr_replace():把字符串的一部分替换为另一个字符串 str_replace():使用一个字符串替换字符串中的另一些字符substr_replace() substr_replace() 函数用于把字符串的一部分替…...
2023/3/16 12:34:47 - Android开发者指南(12) —— Android Supported Media Formats
本文档描述了Android平台支持的媒体播放解码器、网络协议。 作为一名应用软件开发者,你可以自由使用平台上的媒体解码器,这些编解码可以是平台提供,或者是特定设备支持。然而,最好习惯于使用媒体编码配置信息使得应用软件代码编写…...
2023/3/16 12:06:17 - Quartz.NET
概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对…...
2023/3/16 11:38:32 - java算法-递归算法
2019独角兽企业重金招聘Python工程师标准>>> 不废话直接上代码 public class maxtest {public static void main(String[] args) {//###################阶乘递归算法start###################//System.out.println(f(5));//###################阶乘递归算法start##…...
2023/3/16 11:09:32 - Lifecycle-library-stable
Google 最近发布了稳定Lifecyclelibrary。笔者认为:如果你正在使用alpha或者beta版本,以下内容可能对你有用。 Deprecated LifecycleActivity 在stable version 1.0.0 之前,LifeCycle Library 并没有实现 LifecycleOwner这个接口,…...
2023/3/16 10:41:08 - 数据结构——哈希表
前言 使用哈希表可以进行非常快速的查找操作。但是,哈希表究竟是什么玩意儿?很多人避而不谈,虽然知道经常用到,很多语言的内置数据结构像python中的字典,java中的HashMap,都是基于哈希表实现。但哈希表究竟…...
2023/3/16 10:14:40 - Bootstrap~Panel和Table
在我们对一个页面进行设计时,分块是必须的,没有一个网站是一栏而下的,除非你是在看小说,否则你的页面设计一定是分块的,即它由于多个panel组件,在bootstrap里叫到栅格系统,而在每行每列进行宏观…...
2023/3/16 6:40:03 - pyspider操作千万级库,pyspider在对接量级较大库的策略
pyspider操作千万级库,pyspider在对接量级较大库的策略 如果是需要pyspider正常的流程去执行,那必然是会在on_strat()时任务执行超时,可能只读取出几万条或十几万条数据就会被破终止,然后执行index_page(),由于这个超时…...
2023/3/16 6:09:47 - Js+MVC~公用API的设计,返回jsonp后使ajax的error属性生效!
相关知识说明 项目用公用的API事实上就是其它子项目,包括非子项目需要从这个项目中得到一个公用的信息,这种产生信息的接口我们称为公用的API(application program interface)&#…...
2023/3/16 8:48:42 - 【CentOS 7笔记51】,screen虚拟终端#171207
2019独角兽企业重金招聘Python工程师标准>>> hellopasswd screen工具 为了不让一个任务意外终端nohup command &screen是一个虚拟终端yum install -y screenscreen直接回车就进入了虚拟终端ctral a组合键再按d退出虚拟终端,但不是结束screen -ls查看…...
2023/3/16 0:46:40 - 行内元素和块级元素(转)
行内元素和块级元素 2013-01-05 11:40 by greenal, 88623 阅读, 3 评论, 收藏, 编辑 1 块级元素:div , p , form, ul, li , ol, dl, form, address, fieldset, hr, menu, table行内元素:span, strong, em, br, img , input, label…...
2023/3/16 12:33:43 - 微信JSApi支付~坑和如何填坑
微信一直用着不爽,这几天研究它的jsapi支付,即在微信内打开H5页面,完成支付的过程,在这个过程中,你将会遇到各种各样的问题,而大叔将把这些问题的解决方法写一下,希望可以给你带来帮助ÿ…...
2023/3/16 12:05:20 - 阿里云ECS服务器Linux环境下配置php运行环境
阿里云ECS服务器Linux环境安装配置PHP的运行环境,不同于window操作系统下配置,因为是linux操作系统主要是在命令窗体里输入命令来操作,对于初次接触过linux系统的可能会有点怕怕的,下不去手。。。。。。 需要安装的软件有Apacheph…...
2023/3/16 0:45:51 - vim文本编辑器和yum的搭建
rpm -ivh 软件名-版本信息-.rpm (安装软件) rpm -q 软件名 (查看软件是否安装) rpm -e 软件名 (卸载转件) 因为rpm有依赖关系而yum刚好解决此问题 使用vim创建/修改文本文件 vim文本编辑器 命…...
2023/3/16 13:02:32 - sql developer 连接oracle错误一例(ORA-12505)
Oracle安装于VM中用sql developer连接oracle报ORA-12505再三检查lsnrctl status,不得正常后来再发现是oracle instance没有启动。转载于:https://blog.51cto.com/9882derek/2049088...
2023/3/16 13:02:32