源码

lodash源码分析之baseSlice()函数

♀尐吖头ヾ 提交于 2019-12-24 07:40:04
源码 function baseSlice ( array , start , end ) { var index = - 1 , length = array . length ; if ( start < 0 ) { // 传入的参数转换 start = - start > length ? 0 : ( length + start ) ; } end = end > length ? length : end ; // 这里判断之后,end依然有可能为负数 if ( end < 0 ) { // 传入的参数转换 end += length ; } // 先对start和end单独做判断,然后,二者在比较 length = start > end ? 0 : ( ( end - start ) >>> 0 ) ; // 按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。 start >>>= 0 ; var result = new Array ( length ) ; while ( ++ index < length ) { result [ index ] = array [ index + start ] ; } return result ; } 我的代码 // 数组的slice方法重写 function mySlice ( arr ,

[转载]spring-security-oauth2(三) 认证流程源码分析

你说的曾经没有我的故事 提交于 2019-12-24 06:10:33
认证流程源码分析 之前的代码中,我们自定义了登陆路径,自定义成功和失败处理器以及自定义的用户登陆信息校验,下面我们通过简单的源码分析,来把这些串联起来 认证流程处理说明 认证结果如何在多个请求之间共享 获取认证用户信息 认证处理流程说明 spring-security过滤器链 关于web中过滤器 、拦截器 、监听器区别 https://blog.csdn.net/Jintao_Ma/article/details/52972482 idea断点调试: https://blog.csdn.net/deepwishly/article/details/54645022 表单过滤器认证流程如下: UsernamePasswordAuthenticationFilter:表单用户名登陆过滤器 AuthenticationManager:管理所有的Provider,并选择适合的进行验证 AuthenticationProvider:验证提供者,可以自己写provider处理自己的业务场景逻辑 UserDetailsService:验证用户登陆信息 UserDetails:用户信息 Authentication:认证信息封装 下面我们进行登陆断点调试: UsernamePasswordAuthenticationFilter

Glide源码导读

二次信任 提交于 2019-12-24 00:13:19
最近比较无聊,为了找点事干,就花了两天时间把Glide的源码大概看了一下。刚开始看Glide的源码头脑还是比较乱的,因为作者引入了几个概念,又大量用了泛型,如果不了解这些概念读起代码来就比较痛苦,我也没有详细看各种实现细节的东西,只是了解了下这个框架的大概样子,在这篇文章里,我会介绍下Glide中的一些关键概念,并走一遍图片加载流程,如果你要阅读Glide源码的话,应该多少会有点帮助。 基本概念 首先是三个最基本的概念: Model , Data 和 Resource 。 想一下,我们加载图片需要什么?一般是一个url,但url并不是所有情况,还有资源ID,文件等等,甚至可以是Feed流中的一条Feed,虽然一般我们会从Feed中取出图片的url来转换为从url中加载的情况,Glide把这些抽像为了一个概念,就是 Model ,所以 Model 就是数据地址的最初来源。 Model 并不能直接解析为图片,比如一个url,是要转换为网络流的InputStream才能被解析为图片的, Model 需要进行一次转换才能做为数据解析的数据源,这些转换后的东西就叫做 Data ,Glide并没有一个Data类,但有很多和它相关的概念,如dataClase,DataFetcher等。 那么 Resource 呢,其实它就是一个包装类,一个wrapper,它wrap一个对象

LinkedList详解(源码详解)

微笑、不失礼 提交于 2019-12-23 21:46:43
LinkedList基本结构 LinkedList底层使用 双向链表 实现,可以进行向前和向后的遍历,以及头插和尾插,获取数值也可以获取头和获取尾。 Linked继承那些类,实现那些接口 同样LinkedList也是List接口的具体实现类 继承AbstractSqquentialList,实现了List,Deque,Cloneable,java.io.Serializable接口。 也就是说LinkedList不仅拥有List的方法实现,还有Deque的方法实现,也就是队列。 LinkedList允许重复?有序?允许为空? 让我们看一下LinkedList的add方法() add方法内部直接调用LinkLast在尾部添加去添加数据 允许重复 :在插入的时候并没有检查所有节点中是否有重复的 有序 :插入是按照顺序插入的 允许为空 :再进行添加时,并没有对null进行其他处理 结果: LinkedList的底层结构与常用方法 前面提到LinkedList的底层实现结构是双向链表,我们来看一下底层源码的具体实现 我们可以看出这个LinkedList的节点引用有两个,一个指向前驱,一个指向后继。 并且还创建了 两个节点,分别指向头和尾 构造器 无参构造器: public LinkedList() { } 什么都不做,因为链表的添加是链接节点不需要开辟空间等等 有参构造器:public

关于SpringIOC容器中配置ShiroFilter的注意点

送分小仙女□ 提交于 2019-12-23 21:34:10
简单记住一句话(这也是最常使用的用法): Spring的配置文件applicationContext.xml中配置的ShiroFilter的bean的id必须和web.xml中的DelegatingFilterProxy的filter的一致 解释原因: 2.1 从问题入手来分析不一致会怎么样,下图分别是我的web.xml中配置的DelegatingFilterProxy和applicationContext.xml中配置的ShiroFilter信息 2.2 目前id和是一致的,启动tomcat容器也不会出错 2.3 此时如果关闭tomcat容器,然后修改二者使其不相等,再次启动tomcat会发生什么呢?请看下图 2.4 发现tomcat容器在启动时报了一堆错误,主要信息提取的话就是指定的ShiroFilter有问题 解决问题 3.1 要彻底明白这个问题,最好还是要去web.xml中的DelegatingFilterProxy源码看个究竟了(如果没有源码,请自行下载Spring-web的源码包) 3.2 注意源码开头的这几句话 3.3 第一段:这是一个标准Servlet过滤器的代理,委托给一个实现过滤器接口的spring托管bean.支持使用"targetBeanName"的初始化参数来指定使用SpringIOC容器中的哪个bean对象 3.4 第二段:web

vue 源码解析

无人久伴 提交于 2019-12-23 20:02:58
这几天看了一些vue 的相关源码,小结一下。 vue工作机制 vue 响应式的原理defineProperty class KVue { constructor(options) { this._data = options.data; this.observer(this._data); } observer(value) { if (!value || typeof value !== "object") { return; } Object.keys(value).forEach(key => { this.defineReactive(value, key, value[key]); }); } defineReactive(obj, key, val) { Object.defineProperty(obj, key, { enumerable: true /* 属性可枚举 */, configurable: true /* 属性可被修改或删除 */, get() { return val; }, set(newVal) { if (newVal === val) return; this.cb(newVal); } }); } cb(val) { console.log("更新数据了", val); } } let o = new KVue({ data: { test

java 8 Hashmap深入解析 —— put get 方法源码

主宰稳场 提交于 2019-12-23 18:30:53
本文为原创博文,转载请注明出处,侵权必究! 每个java程序员都知道,HashMap是java中最重要的集合类之一,也是找工作面试中非常常见的考点,因为HashMap的实现本身确实蕴含了很多精妙的代码设计。   对于普通的程序员,可能仅仅能说出HashMap线程不安全,允许key、value为null,以及不要求线程安全时,效率上比HashTable要快一些。稍微好一些的,会对具体实现有过大概了解,能说出HashMap由数组+链表+RBT实现,并了解HashMap的扩容机制。但如果你真的有一个刨根问题的热情,那么你肯定会想知道具体是如何一步步实现的。HashMap的源码一共2000多行,很难在这里每一句都说明,但这篇文章会让你透彻的理解到我们平时常用的几个操作下,HashMap是如何工作的。   要先提一下的是,我看过很多讲解HashMap原理的文章,有一些讲的非常好,但这些文章习惯于把源代码和逻辑分析分开,导致出现了大段的文字讲解代码,阅读起来有些吃力和枯燥。所以我想尝试另一种风格,将更多的内容写进注释里,可能看起来有些啰嗦,但对于一些新手的理解,应该会有好的效果。 HashMap结构   首先是了解HashMap的几个核心成员变量(以下均为jdk源码): 1   transient Node<K,V>[] table;        //HashMap的哈希桶数组

【React源码学习】Suspense && Children

為{幸葍}努か 提交于 2019-12-23 16:00:43
Suspense 16.6 提供的一个feature,在线源码地址: https://github.com/facebook/react/blob/master/packages/react/src/React.js 在一个Suspense组件,它下面渲染了一个或者多个异步的组件,有任何一个组件throw了一个promise之后,在这个promise的resolved之前,都会显示fallback中的内容。 也就是说,在一个Suspense组件中,有多个组件,它要等它里面所有组件都resolved之后,才会撤销掉fallback中的内容 demo // suspense/index.js import React, { Suspense, lazy } from 'react' const LazyComp = lazy(() => import('./lazy.js')) let data = '' let promise = '' function requestData() { if (data) return data if (promise) throw promise promise = new Promise(resolve => { setTimeout(() => { data = 'Data resolved' resolve() }, 2000) })

Mysqldump源码分析

元气小坏坏 提交于 2019-12-23 11:19:34
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 版权声明:本文由王珏原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/261 来源:腾云阁 https://www.qcloud.com/community Mysqldump源码分析 王珏 标签: MySQL 2016-12-13 15:41:13 21 本文对mysql5.6.24 mysqldump工具做了简要分析,流程调用序列如下图所示: 流程分析: get_options : 获取mysql参数 connect_to_db : 连接mysql write_header : 写入文件头,保存源数据库原始变量值:字符集、时区、SQL mode等 -- MySQL dump 10.13 Distrib 5.6.24, for Linux (x86_64) -- -- Host: localhost Database: test -- ------------------------------------------------------ -- Server version 5.6.24-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*

以太坊挖矿源码分析

戏子无情 提交于 2019-12-23 10:59:50
先看一下流程图 首先在你打开console时,系统会帮你做好一些准备,比如说new好miner,worker等 入口 可以看到,miner有6个方法,那么对应的源码中就会有6个api。 在eth包中api.go中,可以看到有以下6个api。 那么接下来,就让我们去仔细看一下这6个api的具体功能实现。 miner.start() //有一个参数,即挖矿所需协程数量 func (api *PrivateMinerAPI) Start(threads *int) error { // Set the number of threads if the seal engine supports it //如果协程个数指针为空那么,那么就new一个 if threads == nil { threads = new(int) //如果协程个数为0,那么就让就指定其为-1,接下来挖矿时就无法开启协程 } else if *threads == 0 { *threads = -1 // Disable the miner from within } type threaded interface { SetThreads(threads int) } //断言 if th, ok := api.e.engine.(threaded); ok { log.Info("Updated mining