源码

java查看源码

回眸只為那壹抹淺笑 提交于 2020-01-26 19:53:57
按住Ctrl,然后用鼠标点击类名 比如以String为例: 来源: CSDN 作者: 健脑消识片 链接: https://blog.csdn.net/DoMyBestintheworld/article/details/104088527

sharding-jdbc-core 源码分析

不羁的心 提交于 2020-01-26 18:27:18
目录 Sharding-Jdbc 源码分析 1. Sharding-Jdbc 包结构 2. JDBC 四大对象 2.1 DataSource 2.2 Connection 2.3 Statement 2.4 ResultSet 3. Sharding-Jdbc 执行流程分析 4. sharding-jdbc-core 任务执行分析 4.1 ShardingStatement 4.2 StatementExecutor Sharding-Jdbc 源码分析 Apache Sharding-Sphere 系列目录( https://www.cnblogs.com/binarylei/p/12217637.html ) 在看 Sharding-Jdbc 源码之前,强烈建议先阅读一直官网的文章: Apache Sharding-Jdbc 数据分片 JDBC 调用过程如下:APP -> ORM -> JDBC -> PROXY -> MySQL。如果要完成数据的分库分表,可以在这五层任意地方进行,Sharding-Jdbc 是在 JDBC 层进行分库分表,Sharding-Proxy 是在 PROXY 进行分库分表。 Sharding-Jdbc 是一个轻量级的分库分表框架,使用时最关键的是配制分库分表策略,其余的和使用普通的 MySQL 驱动一样,几乎不用改代码。具体使用方法参考:

Android EventBus3.0源码解析

久未见 提交于 2020-01-26 15:02:14
前言 上一篇 我们讲到了EventBus3.0的用法,这一篇我们来讲一下EventBus3.0的源码以及它的利与弊。 1.构造函数 当我们要调用 EventBus 的功能时,比如注册或者发送事件,总会调用 EventBus.getDefault() 来获取 EventBus 实例: public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus(); } } } return defaultInstance; } 很明显这是一个单例模式,采用了双重检查模式 (DCL),不了解的同学可以查看 设计模式(二)单例模式的七种写法 这篇文章。 接下来看看 new EventBus() 做了什么: public EventBus() { this(DEFAULT_BUILDER); } 这里 DEFAULT_BUILDER 是默认的 EventBusBuilder ,用来构造 EventBus : private static final EventBusBuilder DEFAULT_BUILDER = new

dubbo(2.5.3)源码之Directory与LoadBalance

五迷三道 提交于 2020-01-26 14:40:16
D irectory: 集群目录服务 Directory, 代表多个Invoker, 可以看成List<Invoker>,它的值可能是动态变化的比如注册中心推送变更。集群选择调用服务时通过目录服务找到所有服务 StaticDirectory: 静态目录服务, 它的所有Invoker通过构造函数传入, 服务消费方引用服务的时候, 服务对多注册中心的引用,将Invokers集合直接传入 StaticDirectory构造器,再由Cluster伪装成一个Invoker ; StaticDirectory的list方法直接返回所有invoker集合; RegistryDirectory: 注册目录服务, 它的Invoker集合是从注册中心获取的, 它实现了NotifyListener接口实现了回调接口notify(List<Url>) 通俗的来说,就是一个缓存和更新缓存的过程 Directory目录服务的更新过程 RegistryProtocol.doRefer 方法,也就是消费端在初始化的时候,这里涉及到了 RegistryDirectory这个类。然后执行cluster.join(directory) 方法。这些代码在上篇博客有分析过。 cluster.join 其实就是将 Directory中的多个Invoker伪装成一个Invoker, 对上层透明,包含集群的容错机制

Solr4.8.0源码分析(7)之Solr SPI

a 夏天 提交于 2020-01-26 13:35:07
Solr4.8.0源码分析(7)之Solr SPI 查看Solr源码时候会发现,每一个package都会由对应的resources. 如下图所示: 一时对这玩意好奇了,看了文档以后才发现,这个services就是java SPI机制。首先介绍下java SPI机制,然后再结合Solr谈一下SPI。 1. JAVA SPI 当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。 jdk提供服务实现查找的一个工具类:java.util.ServiceLoader 假设有一个内容搜索系统,分为展示和搜索两个模块。展示和搜索基于接口编程。搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。实例代码如下: Search.java: 搜索接口 1 package search; 2 3 import java.util.List; 4 5 import definition.Doc; 6 7 public interface Search { 8

std::future如何实现

瘦欲@ 提交于 2020-01-26 13:00:48
文章目录 引言 猜测 源码分析 结论 引言 C++11中引入了一个异步编程的利器 std::future (虽然javaGDK5中就已经引入了),这显然使我们的异步编程的过程变得即简介又易维护,但学习不能仅停留在知道它是干什么的的阶段,显然正确的使用时机也是我们需要学习的,但是总感觉对其使用有点不得心应手,遂决定简单的看看源码,看看其是如何实现的. 猜测 在看源码之前 首先自己想一想这个过程当然也是极好的 那我们一起来捋一捋吧 其实过程想来简单 就是在线程结束时以一种方式异步通知当前持有std::future的唯一线程(std::future支持移动不支持复制), 怎么做呢,我当时的想法是这样的 1. 条件变量 future对象中设置一个条件变量 在异步线程结束时调用notify_one(),在get()函数中调用wait(),这样可以实现一个简单的异步调用,缺点是需要互斥量,条件变量,一个仅发生一次的过程这样不免有些浪费,wait()操作更是需要加锁解锁,也就是说这样一个完整的过程我们需要加锁解锁各两次,还需要一个notify_one(),但优点也很明显,过程简单,且如果等待时间较长,可以把cpu让给其他工作线程,全局上节省的时间随等待时间加长而变长,但等待时间短的话除了完成功能就没有丝毫优势了. 2. 自旋锁 自旋锁显然也可以解决这个问题,我们只需要设置一个类内的原子变量

crawlspider介绍及其源码分析

送分小仙女□ 提交于 2020-01-26 12:04:38
文章目录 1. spider文件 2. 简单介绍 3. crawlspider源码 4. 源码解析 4.1 Rule源文件 4.2 参数解析 1. spider文件 # -*- coding: utf-8 -*- import scrapy from scrapy . linkextractors import LinkExtractor from scrapy . spiders import CrawlSpider , Rule class Sohu2Spider ( CrawlSpider ) : name = 'sohu2' allowed_domains = [ 'aaa' ] start_urls = [ 'http://aaa/' ] rules = ( Rule ( LinkExtractor ( allow = r 'Items/' ) , callback = 'parse_item' , follow = True ) , ) def parse_item ( self , response ) : item = { } #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]'

werkzeug源码阅读笔记(二) 上

别来无恙 提交于 2020-01-26 11:17:14
因为第一部分是关于初始化的部分的,我就没有发布出来~ wsgi.py ————第一部分 在分析这个模块之前, 需要了解一下 WSGI , 大致了解了之后再继续~ get_current_url() 函数 很明显,该函数的作用是获取当前url地址。 代码如下: def get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None): """ :param environ: the WSGI environment to get the current URL from. :param root_only: set `True` if you only want the root URL. :param strip_querystring: set to `True` if you don't want the querystring. :param host_only: set to `True` if the host URL should be returned. :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted` for more

学习JDK1.8集合源码之--ArrayDeque

谁说我不能喝 提交于 2020-01-26 11:14:52
1. ArrayDeque简介   ArrayDeque是基于数组实现的一种双端队列,既可以当成普通的队列用(先进先出),也可以当成栈来用(后进先出),故ArrayDeque完全可以代替Stack,ArrayDeque是非线程安全的,Stack是线程安全的。   ArrayDeque虽然是基于数组实现的,但很容易被数组这种数据结构所迷惑。因为数组是从0开始到length-1位置结束的,但ArrayDeque的实现实际上是一种循环结构的队列,首尾位置完全靠head和tail两个首尾指针来决定的,正常理解的情况下head的值应该比tail小,但是这里会出现head比tail大的情况。所以这里我们不能以正常数组的角度去看待,我可以把这个数组看成一个环形结构的首尾相连的结构,即数组最后一位的下一位就是第一位(不要习惯性把0当成头部,length-1当成尾部),数据都存储在head右边及tail的左边,不知道有没有说清楚~~   除此之外,ArrayDeque对队列的容量有特殊的要求,必须是2^n(这里和HashMap类似),由于2^31超出int的最大值,故ArrayDeque的最大容量为2^30。ArrayDeque不允许存储null值,原因是需要通过取出的元素是否为null来判断队列是否为空。   关于更多关于ArrayDeque的讲解,这篇文章讲的很好: 【源】ArrayDeque

Sharding-Proxy 源码分析

北城余情 提交于 2020-01-26 09:33:39
目录 Sharding-Proxy 源码分析 Sharding-Proxy 包结构 Sharding-Proxy 启动流程 Sharding-Proxy 请求接入 MySQL 报文解析器 MySQL 执行器 MySQLComQueryPacketExecutor 执行流程 MySQLComStmtExecuteExecutor 执行流程 Sharding-Proxy 消息处理 Sharding-Proxy 源码分析 在看 Sharding-Proxy 源码之前,强烈建议先阅读一直官网的两篇文章: Apache Sharding-Proxy 使用手册 Apache Sharding-Proxy 设计原理 Sharding-Proxy 包结构 sharding-proxy ├── sharding-proxy-backend 负责与底层mysql通信 ├── sharding-proxy-bootstrap 启动sharding-proxy ├── sharding-proxy-common yaml配置文件加载... ├── sharding-proxy-frontend 启动socket,代理mysql/pg │ ├── sharding-proxy-frontend-core 启动sokcet │ ├── sharding-proxy-frontend-mysql