- 博客(51)
- 收藏
- 关注
原创 OkHttp——OKio(7)
文章目录OKio结构图OKio读取文本OKio写入文本总结OKio结构图从左半部分的图我们可以看出OKio本质是对Java原生IO对一次封装。那么,在OKio 的帮助下,完成一次读写操作又是怎样的呢?OKio读取文本下面是一段按行读取文本的代码,其首先构建一个Source,类似于Java的InputStream,然后构建一个BufferedSource,类似于Java的Buffered...
2019-09-22 22:15:30
480
原创 OkHttp——连接池管理(6)
文章目录OkHttp分层结构中流砥柱之StreamAllocation连接池 ConnectionPoolRealConnection总结OkHttp分层结构OkHttp 分层结构如下图所示,其中连接池部分位于我们的最底层连接层中。在 OkHttp的拦截器中最后两个拦截器ConnectInterceptor 、 CallServerInterceptor 分别用于打开连接和从当前连接中写入...
2019-09-15 11:15:25
1464
原创 OkHttp——Dispatcher(5)
文章目录OkHttp架构图Dispathcer 整体分析Dispatcher的异步请求实现OkHttp架构图OkHttp的整体架构如下图所示,其中Dispatcher处RealCall和拦截器之间。Dispathcer 整体分析Dispatcher是保存同步和异步Call的地方,并负责执行异步AsyncCall。如下图所示,针对同步请求,Dispatcher使用Deque runn...
2019-09-08 22:45:06
531
原创 OkHttp——Interceptor(4)
1. 首先我们我们还是以我们已经了解的例子引入我们今天的主题——拦截器。第一段代码是RealCall的execute同步请求。第二段代码是RealCall中的AsyncCall的execute异步请求。它们都执行了Response response = getResponseWithInterceptorChain();。下面是该方法的代码:这里主要是创建了一个Intercepto...
2019-09-01 20:45:54
320
原创 HashSet源码解析(基于JDK1.8)
HashSet是Java中经常被用到的集合,弄清它的底层实现,有利于我们更好地使用它,又是这句话….. 不过HashSet相对于其他集合框架简单了不少。老规矩,还是先看看它的UML图:①:实现了Serializable接口,表明它支持序列化。 ②:实现了Cloneable接口,表明它支持克隆,可以调用超类的clone()方法进行浅拷贝。 ③继承了AbstractSet抽象类...
2018-06-04 12:57:48
4492
3
原创 HashMap源码解析(基于JDK1.8)
散列是一种用于以常数平均时间执行插入、删除和查找的技术。HashMap是基于哈希表的Map接口实现,该实现提供了所有可选的映射操作,并允许使用 空值和空键。(HashMap 类大致等同于Hashtable,除了它是不同步的并且允许为空值。)这个类不能保证Map的顺序; 特别是,它不能保证顺序会随着时间的推移保持不变。下面就开始我们的源码分析吧:老规矩,先贴一张UML图:①:...
2018-06-02 10:36:36
1453
2
原创 ArrayList初始化容量的问题
(所有的图片的代码来源于JDK1.8中的源码) 可能很多同学听到网上其他人说ArrayList的底层数组elementData的初始化容量是10。其实并不是!,下图是我们经常初始化ArrayList使用的构造器: 而DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一个空的数组,请看下面的图示: 说白了就是,每次我们调用初始化一个空白的集合ArrayL...
2018-05-30 19:35:53
16416
6
原创 栈的应用之中缀表达式到后缀表达式的转化
中缀表达式是我们的日常计算中常用的表达式,它更加符合人类的思维方式,诸如a+b。 而后缀表达式是计算机中较为常见的用于计算的表达式,诸如ab+。 相应的还有前缀表达式。这里主要介绍中缀表达式转后缀表达式时栈的应用: 首先需要我们准备一个栈和一个队列。 遍历中缀表达式的过程中,如果遇到的元素是数字,我们就把它放入队列中,如果是符号且是第一次遇到符号的情况下,我们就把该符号...
2018-05-28 16:31:07
404
原创 栈的应用之编译器检测语法错误
编译器检查程序的语法错误,但是常常由于缺少一个符号(如遗漏一个花括号或是注释起始符)引起编译器报错。在程序中,每个左方括号、左圆括号都有与之对应的右括号。一旦只有左右括号中的一种,编译器就报错。下面我们就看看栈的在这里的应用:我们这里只考虑圆括号、花括号、方括号,暂时忽略其他符号。下面我们就给出算法设计思想: 首先我们需要给出一个空栈,然后把待检测的代码中的字符一一入栈,在入...
2018-05-28 15:39:30
1183
原创 LinkedList源码解析(基于JDK1.8)
LinkedList将做为双链表来实现,它本身实现了List接口和Deque接口,并且实现了所有可选的列表操作,并且允许包含所有元素(包括null)。下图是LinkedList的UML图:从图中我们可以看出:继承了AbstractSequentialList抽象类:在遍历LinkedList的时候,官方更推荐使用顺序访问,也就是使用我们的迭代器。(因为LinkedList...
2018-05-27 18:41:48
8404
7
原创 Java中的反射以及在spring下读取resources目录下的文件(不使用注解)
最近自己写了一个读取资源配置文件程序,顺带直接回顾了一下反射的知识。通过反射获取类、类对应的属性、类中的方法、设置属性值、执行方法。网上大多数的获取资源文件中的配置是直接使用注解的,所以我这里特定整理了直接使用代码读取资源,这样有利用理解spring中对资源的管理。由于习惯了springboot中不用自己整理依赖的版本,所以,直接就使用了springboot建立的工程。对其...
2018-05-26 11:53:12
1545
原创 ArrayList源码解析(基于JDK1.8)
ArrrayList是Java中经常被用到的集合,弄清楚它的底层实现,有利于我们更好地使用它。下图是ArrayList的继承关系图: 从图中我们可以看出:1: 实现了RandomAccess接口:表面ArrayList支持快速(通常是常量时间)的随机访问。官方源码也给出了解释:(因为底层实现是一个数组,所以get()方法要比迭代器快,后面还会更有更加详细的源码解析) ...
2018-05-23 17:20:53
1048
2
原创 RabbitMQ中的发布/订阅(Publish/Subscribe)
在前面的工作队列中,每个任务都只会传递给一个消费者。 而在发布/订阅模式下,我们会向多个消费者传递信息。 在这种模式下,发布的消息将被广播给所有的消费者。RabbitMQ中的消息传递模型的核心思想是生产者永远不会将任何信息直接发送到队列中,实际上,生产者甚至不知道消息是否会被传送到队列中。相反,生产者只能把信息发送到exchange(交换中心)中,exchange也非常...
2018-05-17 17:07:32
5206
1
原创 RabbitMQ中的工作队列(work queues)
工作队列的设计思想:避免立即执行资源密集型任务。 我们将任务封装为消息并将其发送到队列,消费者从队列中取出任务并执行任务。当我们开启了多个消费者的时候,任务将在他们之间共享。循环调度 使用工作队列的优点之一就是能够轻松地把平行任务,也就是说,在使用工作队列时,任务能够被平行地分发给各个消费者。 如果工作队列中的消息过多,我们可以很方便的添加更多的消费者,来缓解压力。默认情...
2018-05-17 11:59:08
1234
原创 RabbitMQ的基本概念及在Java中的初级使用
RabbitMQ是一个消息代理,它负责接收和转发消息。 RabbitMQ用于接收、存储和转发二进制数据块。下面给出RabbitMQ中几个重要的概念:①队列:(queue) 那队列有什么用呢? 尽管消息流经RabbitMQ和我们的应用程序,但是这些消息只能存储在队列中,这就是队列的作用。 一个队列只受主机内存和磁盘限制的约束,它本质上是一个很大的消息缓冲区。 多个生产者...
2018-05-16 13:30:25
823
原创 Spring之跨域资源共享(CORS)
CORS允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。 整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一...
2018-05-06 10:23:15
255
原创 浅谈RPC远程调用
RPC远程调用需要解决的问题:①统一标识在本地调用时,编译器可以通过帮我们使用指针调用相应的方法,而远程调用中,又于是不同的内存空间,所以无法识别。因此这个时候我们需要在调用方和被调用方对其中的相同的方法做一个统一的记号ID标识,然后分别在两端维护一张表,用来维护两端相同的方法,两端对应相同的方法对应的ID必须一致。②数据格式的转化(也就是我们的序列化和反序列化问题)在客户...
2018-05-03 20:07:26
319
原创 Spring Cloud 之Eureka 服务注册与发现
Spring Cloud Eureka是 Spring cloud Netflix微服务套件中的一部分。 Spring Cloud Eureka 是基于Netflix Eureka 做了二次封装。主要由两个组件组成:Eureka Server:Eureka服务端,它是供服务端注册的服务器Eureka Server作为服务注册功能的服务器,它是服务注册中心,而系统中的其他...
2018-05-02 22:43:41
173
原创 每日设计模式之工厂方法模式
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。**在简单工厂方法中,我们通常会通过在简单工厂类中给定一个方法,然后通过给这个类传递一个参数,然后再在这个方法中通过这个参数的值,在方法内部实例化不同的对象,从而达到了在工厂中创建对象的目的,从而避免了每次新建对象都要在外面实例化新的对象。但是,它的...
2018-04-28 12:37:35
132
原创 Spring
首先定义我们的目标类 (我为该方法设置了参数和返回值,而且返回值是我们的参数)(主要目的是为了在演示如何在Around advice中获取目标方法的参数和返回值,并且修改返回值) 2:然后写我们的切面:3:编写配置文件: 4:测试代码: 5:测试结果: ...
2018-04-08 22:47:37
129
原创 插手容器启动之CustomEditorConfigurer
其他两个BeanFactoryPostProcessor都是通过对BeanDefinition中的数据进行变更以达到某种目的。与它们有所不同,CustomEditorConfigurer是另一种类型的BeanFactoryPostProcessor实现,它只是辅助性地将后期会用到的信息注册到容器,对BeanDefinition没有做任何改动。我们知道,不管对象是什么类型,也不管这些对象...
2018-04-02 21:13:58
1415
原创 插手容器启动之PropertyOverrideConfigurer
前篇的PropertyPlaceholderConfigurer可以通过占位符,来明确表明表明bean定义中的property和properties文件中的各配置项之间的对应关系。如果说PropertyPlacehostConfigurer做的这些是“明事”的话,那相对来说,PropertyOverrideConfigurer所做的可能就有点“神不知鬼不觉”了。我们可以通过Proper...
2018-04-02 20:04:47
360
原创 插手容器启动之propertyPlaceholderConfigurer
如果你不想看propertyPlaceholderConfigurer使用的原理,你可以点击这里 ,直接跳转到你所需要的property-placeholder。 Spring提供了一种叫做BeanFactoryPostProcessor的容器扩展机制。该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改。这就相当于在容器实现的第一阶段...
2018-04-02 19:41:05
366
原创 java注解——实现原理
Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注。内置注解Override - 检查该方法是否是重载方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。D...
2018-03-31 21:45:49
1117
原创 Spring IoC容器之BeanFactory底层实现代码解析(一)
Spring IoC容器是一个提供IoC支持的轻量级容器,除了基本的IoC支持,它作为轻量级容器还提供了IoC之外的支持。如在Spring的IoC容器之上,Spring还提供了相应的AOP框架支持、企业级服务集成等服务。Spring的IoC容器和上节提到的IoC Service Provider 所提供的服务之间存在一定的交集。二者的关系如图:注意:ApplicationConte...
2018-03-31 21:25:30
1137
原创 每日设计模式之代理模式
为其他对象提供一种代理以控制对这个对象的访问。代理模式: 代理和被代理的对象有着相同的行为,而被代理的对象通过和代理实现(合成)组合的关系,然后通过代理展示相应的行为。下面给出代码示例(代码取至维基百科): 代码解释:(你可以先看代码)我们首先需要定义一个接口,用于设定被代理对象的方法。代理和被代理对象都实现该接口,在被代理对象中的构造器实现正常的事务(即从硬盘...
2018-03-20 23:32:45
132
转载 数据库表的水平拆分与垂直拆分
当我们设计的系统中单表的数据量过大的时候,用户查询的时候会明显感觉到速度慢,特别影响体验。 当然啦,我们可以通过优化SQL语句、优化表结构和索引来提高访问速度。但是当表的数据量到了一定程度,即使通过上述手段仍不能满足用户的需求。 这个时候我们就可以通过水平拆分表和垂直拆分表来实现单次查询数据量,从而提高查询速度。水平拆分*所谓水平拆分就是把一张表的数据拆分成多张表来存放...
2018-03-19 09:28:47
606
转载 哈希表
在折半查找、二叉排序树查找、B-树查找中,他们的查找效率都依赖于查找过程中所进行的比较次数。哈希表也称为散列表。 哈希表简单地表述就是每个关键字通过哈希函数得到的唯一的值所组成的表。 它是根据关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找速度。这个映射函数叫做散列函数,也称为哈希函数。存放记录的数组叫做哈希表,也称为散列表。...
2018-03-18 23:21:32
417
原创 浅析设计数据库时是否使用外键约束
外键 (FK) 是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制可在外键表中存储的数据。 在外键引用中,当包含一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,就在这两个表之间创建了链接。 这个列就成为第二个表的外键。如果应用用户量大,并发度高的话,数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,而且不能轻易地进行水平扩展,试想一下,如果对数据库插入...
2018-03-18 18:31:02
426
转载 spring data jpa
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。对于基本的curd操作我们都可以使用jpa来实现。我们可以通过继承JpaRepository <T , ID extends Serializable>接口,来实现了基本的操作。*...
2018-03-15 11:52:32
136
原创 每日设计模式之依赖倒转原则
高层次模块不应该依赖于低层次模块,两个都应该依赖于抽象。 抽象不应该依赖于具体实现,而具体实现必须依赖于抽象。 也就是我们常说的“强内聚、低耦合”。在传统的面向过程开发中,高层模块调用低层模块,高层模块依赖于低层模块,当我们的低层模块变动时,上层模块也要跟着变动,这使用模块的复用性大大降低了。而在面向过程的开发中,无论是高层次模块,还是低层次模块,让他们全部依赖于抽象,依赖倒转原则其实
2018-03-10 17:35:21
166
原创 每日设计模式之里氏代换原则
里氏代换原则:子类型必须能够替换掉他们的父类型。说白了就是子类型替换掉父类型后,系统的行为不会发生变化。也就是说,只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能被真正的复用,而子类也能够在父类的基础上增加新的行为。 正是由于有了子类型的可替代性,才使得使用父类型的模块无需修改的情况下就能够扩展。...
2018-03-10 16:55:37
150
原创 每日设计模式之开放-封闭原则
开放封闭原则是指软件实体(类、模块、函数等)应该可以扩展,但是不可以修改。也就是说对扩展是开放的,对修改时关闭的! 在最初设计时,假设变化不会发生,然而当变化发生时,我们就创建抽象来隔离以后发生的同类变化。 也就是说,当软件出现新的需求时,我们是通过扩展代码来满足需求的,而不是通过修改原来的代码。 开放封闭原则是面向对象设计的核心所在。遵循这个原则可以使我们的软件可维护、可扩展、可复用、而且
2018-03-09 15:59:46
149
原创 每日设计模式之单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。 所谓职责就是引起类变化的原因,如果一个类有多余一个引起它变化的职责时,这是就违背了单一职责。说白了就是,一个类或模块应该有且只有一个引起它改变的原因。在软件设计的过程中,我们就是在发现职责,然后把这些职责相互分离。如果发现多于一个职责去改变类,则我们就要去考虑类的职责分离了,也就是每个类只能有一个职责。
2018-03-08 17:12:25
118
原创 每日设计模式之策略模式
策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。策略模式,简单地说就是:我们首先需要写一个接口,这个接口是用来定义我们的抽象策略。然后写几个类用来实现这个接口,在不同的实现类中实现不同的策略。接着再写一个Context类,让它和策略的接口是聚合关系。然后再在Context类中写一个方法,在方法中通过接口动态的调用各种策略策略模式的精华
2018-03-07 16:13:13
114
原创 每日设计模式之简单工厂模式
简单工厂模式说白了就是把类的实例化封装到一个类的静态方法里面,通过传递给这个类的静态方法不同的参数,从而得到不同的实例。 简言之,就是一个用于加工生产各种对象的类。只需要通过传递参数就能得到相应的对象。简单工厂模式是属于创建型模式,又叫静态工厂方法模式
2018-03-06 14:05:58
141
原创 VMware中的虚拟机设置之网络适配器
在装完虚拟机后,在我们本机的window系统下会多出两个虚拟机网卡,其中一个VMnet1,一个是VMnet8。在虚拟机的网络适配器选项中有网络连接模式供我们选择 1. 桥接模式: 如果我们选用桥接模式,则虚拟机在和我们真实机通信的时候,会利用我们真实机的本地网卡。 优点:不需要任何设置,虚拟机就可以直接和我们真实机通信。 缺点:虚拟机需要占用真实机网段的一个IP。 2. NAT
2018-03-05 16:32:28
15018
原创 Springboot+mybatis 搭配mybatis逆向工程
这里是以MySQL为例。首先我们需要创建数据库。(这里我创建的数据库的名称是newtest)并且创建两张表,分别是category和product。以他们为例演示: 下面是创建这两张表的代码:create table category(id int(11) primary key auto_increment not null,name varchar(255) default null)
2018-02-02 16:47:29
8113
1
原创 如何使用Hibernate?
## hibernate 初体验 ##首先我们需要创建一个数据库,这里起名为test,然后在该数据库下创建一个表product_。(这里我们只以product_测试)2.接着新建一个Java Web工程。在src目录下创建com.sss.pojo包和com.sss.test包。3.然后在pojo包下创建Prodcut和Product.hbm.xml。如下所示:4:在src目录下创建hiberna
2018-01-30 10:24:50
3201
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人