- 博客(323)
- 收藏
- 关注
原创 Spring支持JSONP
支持 Jackson JSONP若需要支持在 @ResponseBody 和 ResponseEntity 方法中支持 JSONP 的使用,可以定一个 @ControllerAdvice bean 并继承 AbstractJsonpResponseBodyAdvice 类。AbstractJsonpResponseBodyAdvice 的构造器说明 JSONP 的查询参数。具体例子如下:@Cont...
2018-03-14 22:10:43 1503
原创 通过spring的BeanWrapper来设置对象属性
假如有下面这两个类:public class Company { private String name; private Employee managingDirector; public String getName() { return this.name; } public void setName(String name) {...
2018-03-09 21:21:35 3485
原创 spring的@Autowired用法大全
我们知道@Autowired普通用法就是注入Bean例子如下: @Autowired private AgencySellerService agencySellerService;其实@Autowired还可以放到方法上,进行注入: @Autowired public void setMovieFinder(MovieFinder movieFinder) { .........
2018-03-03 19:47:12 1357
原创 dubbo中的一致性hash(ConsistentHashLoadBalance)详解
注意:本文适用于了解dubbo以及一致性hash的读者众所周知,dubbo中有四种负载均衡策略:别的负载均衡策略就不细说了,再这里重点说一下dubo中的一致性hash负载均衡:ConsistentHashLoadBalance前面的流程不多说,我们直接进入ConsistentHashLoadBalance的doSelect()方法中: protected <T> Invoker&...
2018-02-27 17:21:09 1779
原创 dubbo源码之拦截调用
dubbo在生成调用者和被调用者的动态代理的时候会生成调用链,在拦截调用链走完后才会进入真正的方法调用,拦截调用分别在消费者端和调用者端都生成了调用链,代码如下:消费者端行成调用链: public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException { if (C...
2018-02-27 15:48:47 924
原创 dubbo源码之ExtensionLoader详解
在dubbo中,有一个核心的东西叫做ExtensionLoader,这个类负责选择用户指定的或者默认的LoadBalance,Cluster,Invoker,注册中心,编解码等,那么想知道dubbo怎么配置,以及默认都是使用的都是什么配置,就要理解清楚这个类。我们以负载均衡的选择为例:loadbalance = ExtensionLoader.getExtensionLoader(LoadBala...
2018-02-27 12:20:05 272
原创 SpringBoot源码解析(十六)事务的SpringAOP源码详解
SpringAOP是spring的动态代理模块。我们在spring的事务等多个方面都用到了springAOP方面的知识。我们就以事务的动态代理原理解析来分析下springAOP的源码。SpringAOP有几个核心概念: (1).切面Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些切入点Pointcut 以及对切入点进行相应的操作的通知Advic...
2018-02-26 23:04:59 690
原创 LinkedBlockingQueue源码解析
LinkedBlockingQueue是无界队列,其内部是链表结构组成的节点,看下其基本结构: static class Node<E> { E item; /** * One of: * - the real successor Node * - this Node, meaning the...
2018-02-09 20:39:48 232
原创 带进度条的上传文件
使用百度的Web Uploader:http://fex.baidu.com/webuploader/getting-started.html
2018-02-09 15:37:16 313
转载 Gradle的安装
前言: 我不是一个勤奋好学的人,奔着新技术就跑去尝试学习。但是在工作或者学习的过程中,遇到了的技术,还是得一个坎一个坎的迈过去。把今天遇到的坎变成明天的垫脚石。 想学习一下 spring 的源码,然后 它是有 gradle 构建的。那一天,我尝试了一半之后,将源码用另外一种形式拿出来看了,就没有继续下去。 今天,看到了一个开源项目,很想拉下来研究下。然后,它也是 gradle 构建的。便只好...
2018-02-08 16:11:35 306 2
原创 sleep与wait是否会占用cpu资源
一直对sleep与wait除了使用方法上的却别外,还对它们是否会占用cpu时间产生了疑惑,故此做了个实验如下:上图中是什么代码都没有执行的时候的cpu利用率,下面我们执行这段代码: public static void main(String[] args) { for (int i = 0; i < 10000000; i++) { Syste...
2018-02-08 13:38:10 38354 16
原创 编译原理(十)Java运行系统
动态绑定规则当对象o的一个方法可能被自类重写时,如果编译器不能确定o的运行时类型,那么必须对该方法进行动态绑定将一个java语言的类翻译成c语言的程序段,主要的工作由如下几点(由继承引出的问题暂不考虑)将Java语言中一个类的所有非静态属性构成一个C语言的结构体类型,取类的名字作为结构体类型的名字类的静态属性是该类的所有对象所共有的,应当翻译成C中的全局变量,但是需要改一个名字。J
2018-02-02 22:07:37 244
原创 编译原理(九)C语言编译系统
C语言编译系统:两边扫描,有些跳转代码,要等翻译过后,才能知道具体位置,所以要进行第二遍编译:连接器目标模块或目标文件的形式可重定位的目标文件可执行的目标文件共享目标文件----一种特殊的可重定位目标文件----在装入程序或运行程序时,动态地装入到内存并连接(例如,当你引入了包含printf的头文件,当用到printf的时候,会将此文件装入内存,否则不装入,如此
2018-02-02 19:41:56 2139
原创 编译原理(八)独立于机器的代码优化
代码优化通过程序变换(局部变换和全局变换)来改进程序,称为优化基本块和流图对每个基本块从最后一个语句反向扫描到第一个语句,可以得到下次引用信息,这样就可以制造出引用链,从而通过是否后面还有引用做出相应的编译优化:数据流分析介绍:B1的入口,是开始都为0,出口生成d1,d2,d3,被注销的是d4,d5,d6,d7所以是111 0000对于B2来说,是生成d4,d5,注
2018-02-01 20:18:20 664
原创 一个简单的代码生成器
我们以(a-b)+(a-c)+(a-c)为例说明 在t3=t1+t2这里,因为t1做完运算就不存在了,所以直接把t3放到了R0中。在最后一步,因为d的值出了计算区域还有可能被引用,所以不仅要把d的值放到R0中,还要把d的值放到内存中。
2018-01-29 21:13:24 2145
原创 编译原理(七)中间代码生成
我们以一个排序来演示中间代码生成语义动作用到的函数mkTable(previous):创建符号表,参数为过程identer(table,name,type,offset):进入符号表,四个参数分别为:表名,参数名称,参数类型,下标addWidth(table,width):增加符号表容量,参数为:哪一个符号表,增加多少容量enterProc(table,name,newtabl
2018-01-27 20:03:09 3704
原创 编译原理(六)运行时存储空间的组织和行为2
堆管理计算机内存分层现代计算机都设计成程序员不用关心内存子系统的细节就可以写出正确的程序程序的效率不仅取决于被执行的指令数,还取决于执行每条执行需要多长时间执行一条指令的时间区别非常可观差异源于硬件技术的基本局限:构造不了大容量的告诉存储器数据以块(缓存行、页)为单位在相邻层次之间进行传送数据密集型程序可以从恰当利用内存子系统中特点上面main函数执行的时候会报错,因为当用st
2018-01-27 17:58:09 322
原创 编译原理(五)运行时存储空间的组织和行为
过程的活动----过程的一次执行称为过程的一次活动活动记录----过程的活动需要可执行代码和存放所需信息的存储空间,后者称为活动记录影响存储分配策略的语言特征过程能否递归当控制从过程的活动返回时,局部变量的值是否要保留过程能否访问非局部变量过程调用的参数传递方式过程能否作为参数被传递过程能否作为结果值传递存储块能否在程序控制下动态地分配存储块是否必须显式地释放过程概念:过程定义、过
2018-01-27 15:13:25 1030
原创 编译原理(四)类型检查2
描述类型系统的语言类型系统主要用来说明编程语言的定型规则,它独立于类型检查算法定义一个类型系统,一种重要的设计目标是存在有效的类型检查算法类型系统的基本概念可用于各类语言,包括函数式语言、命令式语言和并行语言等我们后面讨论用形式方法来描述类型系统类型系统的形式化类型系统是一种逻辑系统 有关自然数的逻辑系统自然数表达式(需要定义它的语法)a+b,3良形公式(逻辑断
2018-01-25 19:44:30 2089
原创 编译原理(三)类型检查
静态检查中最典型的部分——类型检查:类型系统、类型检查、多态函数、重载忽略其它的静态检查:控制流检查、唯一性检查、关联名字检查上面不能在不该出现continue的地方出现continue。C语言:称&为地址运算符,&a为变量a的地址数组名代表数组第一个元素的地址问题:如果a是一个数组名,那么表达式a和&a的值都是数组a第一个元素的地址,它们的使用
2018-01-24 20:52:54 5917
原创 编译原理(二)语法分析器
从软件工程角度看,词法分析和语法分析的分离有如下好处简化设计编译器的效率会改进(词法分析器主要处理字符流)编译器的可移植性加强(例如:向上的箭头,不同的分析器可以用不同的字符,这个只涉及到词法,降低了耦合性)便于编译器前端的模块划分语法分析器对编译器的错误处理做一个概述词法错误,如标识符、关键字或运算符的拼写错误语法错误,如算数表达式的括号不匹配语义错误:如算符作用于不相容的运
2018-01-22 21:45:09 3115
转载 mermaid(markdown)语法
官网地址:http://knsv.github.io/mermaid/index.html图例如从左到右的一个有向图graph LR;A[aa bb]-->B(wo);A-->C((我是C));B-->D>我是D];C-->D;D-->E{我是E};C-->E;2-->E;_-->E;第一行的graph LR中graph指定是一个图,第二个
2018-01-22 20:43:54 7000
转载 多线程中wait跟sleep的区别
前几天去UC笔试,有一道简答题问到了。之前还真一直没留意到这个问题,所以答得也不好。无论学习什么都好,通过对比学习更有利于发现事物的共性和个性,对于知识点的理解更有明显效果(这也可能是UC笔试题上,5道简答题中,有4道都是关于X与Y的区别的问题的原因之一)。既然自己答得不好,那就写下这篇随笔,来警示下自己(不仅是sleep与wait区别,还有多用这种对比学习的学习方式)。翻了很多资料,
2018-01-21 20:47:57 303
原创 SpringBoot调用流程源码(八)conversionService类型转换类源码详解
conversionService是spring中的从前端到后端的类型转换器,一般我们会配置或者自己手动配置HandlerMapping和HandlerAdapter。如果需要从前端页面的字符串自动映射成Date类型等类型转换,我们就要自己手动配置conversionService。
2018-01-15 21:10:24 1152
原创 编译原理(一)
编译器概述:中间代码生成器:代码优化:词法分析器是语法分析器的子程序,当语法分析器分析完一个词法后,会向词法分析器取下一个记号,继续分析,直到分析结束词法分析器:把构成源程序的字符流翻译成记号流,还完成和用户接口的一些任务。此法分析器,会把源程序的字符,翻译成记号,例如if,for是由字符i,f和f,o,r组成。词法记号及属性如下:
2018-01-11 21:44:14 340
原创 SpringBoot源码解析(十九)Spring事务tx源码分析(二)
最近想提升,苦逼程序猿,想了想还是拿最熟悉,之前也一直想看但没看的spring源码来看吧,正好最近在弄事务这部分的东西,就看了下,同时写下随笔记录下,以备后查。spring tx源码分析这里只分析简单事务也就是DataSourceTransactionManager首先肯定找入口了,看过spring源码的同学一定都会找spring tx的入口就是在TxAdviceBeanDefinit
2018-01-08 10:53:40 1019
原创 SpringBoot源码解析(十八)Spring事务tx源码分析(一)
在spring的tx源码中我们知道了,最后会通过AbstractAutoProxyCreator(其有一个父类是beanPostProcessor)的postProcessAfterInitialization(Object bean, String beanName)方法中的wrapIfNecessary方法去createProxy。其中生成jdk动态代理的类是JdkDynamicAopProx
2018-01-06 20:53:01 3266
转载 极致精简的webservice例子
看了网上好多关于webservice的例子,基本上对初学者来说都是模棱两可云里雾里,现在,我将网上关于webservice的讲解提炼出来,通过一个最简单使用并且方便的例子,告诉大家什么是webservice。简单来说,webservice就是远程调用技术,也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻
2018-01-05 21:54:43 305
转载 full gc频繁的情况
full gc频繁说明old区很快满了。如果是一次fullgc后,剩余对象不多。那么说明你eden区设置太小,导致短生命周期的对象进入了old区。如果一次fullgc后,old区回收率不大,那么说明old区太小。然后可以根据情况调整eden区或者old区大小
2018-01-05 20:01:10 703
转载 怎么用java自带反编译工具查看java字节码文件
怎么用java自带反编译工具查看java字节码文件图文教程,用java自带反编译工具查看java字节码文件,首先,配置好java开发环境,环境变量各种配置,这里就不一一说了,相信大家都配置好了。下面入正题----怎么用java自带反编译工具查看java字节码文件工具/原料javapjava+java开发工具方法
2017-12-27 21:47:45 3538
转载 一份从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的。 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的。做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会,去尝试些自己平日里少做的事,我觉得是一件值得庆幸的事。 前段时间,接了个新项目。只有一些idea在业务需求方脑海里,然后就开始需求讨论,然后就开始做事了。项目不复杂,但是由于是用J
2017-12-27 21:33:36 1042
转载 HashMap在并发下可能出现的问题分析
我们都知道,HashMap在并发环境下使用可能出现问题,但是具体表现,以及为什么出现并发问题,可能并不是所有人都了解,这篇文章记录一下HashMap在多线程环境下可能出现的问题以及如何避免。在分析HashMap的并发问题前,先简单了解HashMap的put和get基本操作是如何实现的。1.HashMap的put和get操作大家知道HashMap内部实现是通过拉链法解决哈希冲突的,也
2017-12-27 20:29:54 3373
原创 线程池细节详解ThreadPoolExecutor
关于线程池的几个参数的含义,我们就不多说了,下面我们通过源码看下这几个参数分别是在什么地方使用到的:核心池大小与最大池大小是在执行任务的时候用到的,这里我们不多说。当线程池中没有任务,线程池就会维持核心池大小的线程,这个源码如下:当线程进来会先被封装成一个Worker类,这个类实现了Runnable接口,如下: private final class Worker
2017-12-27 19:57:29 621
转载 Servlet
一、Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术。 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1、编写一个Java类,实现servlet接口。 2、把开发好的Java类部署到web服务器中。 按照一种约定俗成的称呼习惯,通
2017-12-25 21:59:59 188
原创 redis Lua脚本(一)
Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务端原子的执行多个Redis命令。其中,使用EVAL命令可以直接对输入的脚本进行求值:redis>EVAL "return 'hello world'" 0"hello world"而使用EVALSHA命令则可以根据脚本的SHA1校验和来对脚本进行求值,但这个命
2017-12-19 20:52:04 5617 1
转载 jdk8中的PermGen永久代去哪里
Java PermGen 去哪里了?原文链接:原文作者:Monica Beckwith 以下为本人翻译,仅用于交流学习,版权归原作者和InfoQ所有,转载注明出处,请不要用于商业用途在Java虚拟机(JVM)内部,class文件中包括类的版本、字段、方法、接口等描述信息,还有运行时常量池,用于存放编译器生成的各种字面量和符号引用。在过去(自定义类加载器还不是很常见的时候),类大多是”
2017-12-18 23:05:06 1174
转载 Redis分布式锁的正确实现方式(Java版)
本博客使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景。前言分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客
2017-12-18 23:01:43 264
原创 SpringBoot源码解析(十七)ApringAOP的两种方式JdkDynamicAopProxy和Cglib2AopProxy源码解析
在springAOP中,创建动态代理有两种方式,jdk的动态代理与cglib。jdk的动态代理在springAOP中使用的是JdkDynamicAopProxy而cglib在springAOP中使用的类是Cglib2AopProxy,而且创建代理使用的类加载器基本都是ContextClassLoader类加载器。在springAOP中创建动态代理都是通过ProxyFactory的getPr
2017-12-17 21:21:57 4046
转载 redis配置文件讲解
# 守护进程模式# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes# 当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面daemonize yes# 当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/run/redis.pid 文件里面,但是你
2017-12-13 21:06:53 367
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人