自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(170)
  • 收藏
  • 关注

原创 Java虚拟机札记-目录

本目录会随着Java虚拟机札记专栏的更新而更新。JVM虚拟机札记-目录JVM虚拟机札记-概述Java虚拟机札记-Java内存区域划分Java虚拟机札记-垃圾回收与内存分配Java虚拟机札记-Class类文件结构Java虚拟机札记-类加载机制Java虚拟机札记-Java内存模型Java虚拟机札记-线程安全与锁优化

2018-01-17 21:32:54 803 2

原创 Java并发编程札记-目录

本目录会随着专栏的更新而更新。Java并发编程札记-目录Java并发编程札记-(一)基础-01基本概念Java并发编程札记-(一)基础-02创建线程Java并发编程札记-(一)基础-03线程的生命周期Java并发编程札记-(一)基础-04Thread详解Java并发编程札记-(一)基础-05线程安全问题Java并发编程札记-(一)基础-06synchronized详解Java并

2017-11-08 20:58:19 4512 1

原创 Java8 I/O源码-目录

从今天开始,就要开始学习I/O了。本专栏从将根据源码,详细深入地讲解Java I/O的实现。本专栏主要参考《Think In Java》一书,还有网上的一些技术文章。主要讲解Java I/O的源码、优缺点。个人能力有限,难免有考虑不到的地方,如果有哪里不准确,欢迎指出。本专栏参考的JDK版本为1.8。

2017-09-20 21:48:34 17163 2

原创 Java8容器源码-目录

从今天开始,就要开始学习Java容器了。本专栏从了解到使用再到源码,详细深入地讲解Java容器(集合)。本专栏主要参考《Think In Java》一书,还有网上的一些技术文章。主要讲解Java容器的使用、源码、优缺点。个人能力有限,难免有考虑不到的地方,如果有哪里不正确,欢迎指出。本专栏参考的JDK版本为1.8。目录目录会随着本专栏的更新而更新。Java8容器源码-...

2017-08-01 20:34:18 6333 5

原创 Spring源码-目录

Spring是与2003年兴起一个轻量级的开源框架,由Rod Johnson创建。其致力于解决企业应用开发的复杂性,是企业应用开发的“一站式”(full-stack)选择。Spring是分层的,它包含大约20个模块,以控制反转(Inverse Of Control,IOC)与面向切面编程(Aspect Oriented Programming,AOP)为核心。

2017-08-01 16:07:41 2413

原创 设计模式-目录

概述什么是设计模式设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。为什么我们要学习设计模式总体来说,正确地使用设计模式可以增强系统的健壮性,可扩展性。每种设计模式都有其独特的优点,每篇文章中都会对其进行说明。相关词汇GOF说到设计模式,就不得不提GOF(Gang of Four)。他们分别是Erich ...

2017-06-02 14:15:52 2877

转载 深入理解 Spring 异常处理

1.前言相信我们每个人在 SpringMVC 开发中,都遇到这样的问题:当我们的代码正常运行时,返回的数据是我们预期格式,比如 json 或 xml 形式,但是一旦出现了异常(比如:NPE 或者数组越界等等),返回的内容却是服务端的异常堆栈信息,从而导致返回的数据不能使客户端正常解析; 很显然,这些并不是我们希望的结果。我们知道,一个较为常见的系统,会涉及控制层,服务 (业务) 层、缓存层、存...

2019-12-31 21:45:19 490

原创 会计基础概念

会计主体,是指会计工作服务的特定对象,是企业会计确认、计量和报告的空间范围。会计基础,是指会计确认、计量和报告的基础,具体包括权责发生制和首付实现制。会计要素按照其性质分为资产、负债、所有者权益、收入、费用和利润,其中,资产、负债和所有者权益要素侧重于反映企业的财务状况,收入、费用和利润要素侧重于反映企业的经营成果。资产的确认条件与该资源有关的经济利益很可能流入企业。该资源的成本或者价...

2019-12-31 21:18:03 1190

原创 什么是支付“二清”

说到“二清”,有一个案例很出名。2018年11月20日,王海在微博发表文章,举报美团网、大众点评网涉嫌非法经营支付业务。“美团获得支付牌照钱袋宝不用,涉嫌故意违法经营意图逃避监管以便于挪用资金或赚取利差。澎湃新闻链接消费者在美团下单购买商品,美团代商户收取消费者的款项。可是这些款项被美团截取并沉淀一段时间后结算给商户。根据规定,消费者所付款项需由持《支付业务许可证》的第三方支付机构来代收。作为...

2019-10-31 22:19:08 2753

转载 马蜂窝支付中心架构演进

以下文章来源于马蜂窝技术 ,作者电商支付结算团队为了更好地支持交易业务的快速发展,马蜂窝支付中心从最初只支持基础支付和退款的「刀耕火种」阶段,经历了架构调整的「刮骨疗伤」阶段,完成了到实现综合产品平台形态的「沉淀蓄力」阶段的演进。目前,马蜂窝支付中心集成了包括基础订单、收银台、路由管理、支付通道、清算核对、报表统计等多种能力,为马蜂窝度假(平台、定制)、交通(机票、火车票、用车)、酒店(开放平...

2019-10-31 21:36:31 416

原创 跨域资源共享

什么是跨域问题参考:http://www.ruanyifeng.com/blog/2016/04/cors.htmlhttps://segmentfault.com/a/1190000015597029Java服务端跨域问题的解决上面已经介绍了什么是跨域问题,那么作为Java开发者,如果遇到了跨域问题,改怎么解决呢?1、定义过滤器public class CrossFilter ...

2019-09-30 18:51:57 201

原创 Java虚拟机札记-内存区域

众所周知,Java程序员不需要为对象手动分配和释放内存。这要归功于虚拟机。但凡事有利就有弊,一旦出现内存溢出或泄露方面的问题,程序员如果不了解虚拟机是如何管理内存的,排查问题不是件容易的事情。本文将介绍Java虚拟机管理的各个内存区域,为以后学习虚拟机是如何管理内存打好基础。运行时数据区域根据《Java虚拟机规范》,Java虚拟机管理的内存可以分为以下几个运行时数据区域。程序计数器

2019-06-30 19:53:01 177

转载 Java线程池架构2-多线程调度器(ScheduledThreadPoolExecutor)

在前面介绍了java的多线程的基本原理信息:《Java线程池架构原理和源码解析(ThreadPoolExecutor)》,本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分。我们如果要用java默认的线程池来做调度器,一种选择就是Timer和TimerTask的结合,在以前的文章:《Timer与TimerTask的真正原理&使

2019-06-30 19:48:23 384

原创 Netty札记-编解码框架

http://www.infoq.com/cn/articles/netty-codec-framework-analyse/1. 背景1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。反之,解码(Decode)/反序列化(deserialization)把从网络、磁...

2019-05-31 21:05:48 180

原创 Netty札记-Netty线程模型

Reactor线程模型无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件。Reactor单线程模型Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下:作为NIO服务端,接收客户端的TCP连接;作为NIO客户端,向服务端发起TCP连接...

2019-05-31 21:04:09 535

原创 Netty札记-TCP沾包拆包问题

什么是TCP沾包拆包问题TCP可能把一个完整的包拆成多个包发送,也可能把多个小包组合成一个大包来发送。这就是TCP沾包拆包问题。 现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下:第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象,此种情况不在本文的讨论范围内。 第二种情况,接收端只收到一...

2019-03-31 21:26:11 400

原创 RabbitMQ札记-目录

RabbitMQ札记-RabbitMQ入门RabbitMQ札记-工作队列RabbitMQ札记-消息分发策略

2018-12-31 00:00:33 255

原创 RabbitMQ札记-路由

在上文中,我们创建了一个简单的日志系统,它可以将消息广播给多个Consumer。在本文中,我们将为其添加一个功能。Consumer将只能订阅一部分消息。绑定绑定是exchange和queue之间的关系。在前面的例子中,我们已经创建了绑定,queueName为队列的名字,“logs”为Exchange的名字。channel.queueBind(queueName,"logs","

2018-12-01 00:00:21 153

转载 RabbitMQ札记-Topic

在上一篇文章中,我们改进了我们的日志系统。我们使用了直接交换,使Consumer支持选择性地接收日志。尽管如此,它仍然有局限性。为了提高日志系统中的灵活性,我们需要了解更复杂的话题交换。topic exchangetopic是Exchange的五种消息分发策略之一,可以对Routing key进行模式匹配,比如key*可以传递到Routing key为key1、key2、key3的Qu

2018-11-30 23:58:07 151

原创 RabbitMQ札记-消息分发策略

今天来学习RabbitMQ的消息分发策略。在RabbitMQ札记-RabbitMQ入门一文中,我们曾学习过RabbitMQ的概念模型,其中就介绍过消息分发策略。 Exchange表示交换器,用来接收生产者发送的消息并将这些消息路由给队列。从图中可以看出,Procuder发布的Message进入了Exchange。Exchange通过Routing key与Queue绑定在一起。通过Ro...

2018-09-30 15:31:15 2844

转载 (三)Spring MVC源码-2.Spring MVC工作流程

在上篇文章中使用队列解决了消息生产者(Producer)与消息消费者(Consumer)之间的异步通信问题。本文中,我们将创建一个工作队列,用于在多个Consumer之间分配资源密集型任务。工作队列的主要思想是避免立即执行并必须等待资源密集型任务完成,而是安排稍后完成任务。我们把一个任务封装成一个消息并发送给一个队列,这些任务将由Consumer完成。当你运行许多Consumer时,任务将它们间共

2018-08-31 20:32:00 188

原创 (三)Spring MVC源码-1.MVC模式

RabbitMQ是一种消息队列产品。消息队列简介什么是消息队列顾名思义,消息队列是用来接收和转发消息的队列。消息是二进制数据块,可以是简单的字符串,也可以是更复杂的数据对象。队列接收消息生产者发送的消息,并将消息转发给消息消费者。 消息生产者、消息队列、消息消费者不必在同一服务器上,实际上在大多数应用中,它们确实都不在同一服务器上。为什么要使用消息队列从上面对

2018-08-31 20:28:55 213

原创 (二)Spring AOP源码-3.创建AOP代理

背景随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。垂直应用架构当访问量逐渐增大,单一应用增加机器带来的加速度越来

2018-07-31 23:58:18 212

原创 (二)Spring AOP源码-2.从@EnableAspectJAutoProxy开始说起

Dubbo是由阿里巴巴开源的基于Java的高性能RPC框架。简介Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。Dubbo提供三个关键功能,包括基于接口的远程调用,容错和负载均衡,以及自动服务注册和发现。Dubbo架构简介 (图片来自http://dubbo.io/)节点说明 节点 角色说明

2018-07-31 23:56:35 226

原创 (二)Spring AOP源码-1.概述与设计原理-02设计原理

静态代理主要在虚拟机启动时通过改变目标对象字节码的方式完成对目标对象的增强。以静态代理为基础实现的AOP技术的代表为AspectJ。AspectJ在编译期间生成代理对象,因此也称为编译时增强。动态代理不会去修改字节码,而是在运行时在内存中临时生成AOP对象。这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。以动态代理为基础实现的AOP技术则以Spring AOP为代表。Spring AOP的源码中用到了两种动态代理:JDK动态代理和CGLIB动态代理。

2018-06-21 23:42:30 351

原创 (二)Spring AOP源码-1.概述与设计原理-01概述

什么是AOP?AOP(Aspect Oriented Programming),即面向切面编程,可以说是对面向对象编程(OOP)的补充和完善。我们知道OOP允许开发者定义纵向的关系,但并不适合定义横向的关系。比如当需要为多个不具备继承关系的对象添加一个公共行为,例如日志功能,只有在每个类中都引入日志等行为。这样就导致程序中存在大量重读代码,而不利于维护。AOP将那些影响了多个类的公共行为封...

2018-06-21 23:40:47 301

原创 (一)Spring IoC源码-3.其他特性的实现原理-03BeanPostProcessor的实现

BeanPostProcessor是Bean的后置处理器,它可以监听容器触发的事件。BeanPostProcessor是一个接口类,它有两个接口方法: postProcessBeforeInitialization(Object bean, String beanName),在Bean的初始化前提供回调入口;另一个是postProcessAfterInitialization(Object bean, String beanName),在Bean的初始化后提供回调入口。

2018-06-19 23:33:58 244

原创 (一)Spring IoC源码-3.其他特性的实现原理-02循环依赖的解决

原标题:Spring循环依赖的三种方式 原文链接:https://blog.csdn.net/u010644448/article/details/59108799引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。第一种:构造器参数循环依赖Spr...

2018-06-19 22:48:05 272

原创 (一)Spring IoC源码-3.其他特性的实现原理-01lazy-init与预实例化

如果在XML文件中为Bean定义了lazy-init属性,那么Bean的加载在IOC容器初始化时就预先完成了,我们将其称为预实例化。预实例化虽然会对容器初始化的性能有一些影响,但却能够提高应用第一次取得Bean的性能。

2018-06-19 21:17:38 480

原创 (一)Spring IoC源码-2.bean的加载-03从FactoryBean实例中获取目标实例

(一)IoC源码-07bean的加载-01整体概览 (一)IoC源码-07bean的加载-02从缓存中获取单例bean在步骤3和步骤4中中,无论是已经加载到了单例bean还是创建bean后,都需要通过bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);从bean实例中获取对象。无论是从缓存中获取到的b...

2018-06-15 09:06:39 368

原创 (一)Spring IoC源码-2.bean的加载-04创建bean

(一)IoC源码-07bean的加载-01整体概览 (一)IoC源码-07bean的加载-02从缓存中获取单例bean (一)IoC源码-07bean的加载-03创建beanAbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])@Overrideprotected Obje...

2018-06-14 23:59:36 458

原创 (一)Spring IoC源码-2.bean的加载-02从缓存中获取单例bean

(一)IoC源码-07bean的加载-01整体概览DefaultSingletonBeanRegistry.getSingleton(String)@Overridepublic Object getSingleton(String beanName) { return getSingleton(beanName, true);}@Nullableprotected Ob...

2018-06-14 23:24:31 332

原创 (一)Spring IoC源码-2.bean的加载-01整体概览

前面几篇文章都是在学习`BeanFactory bf = new XmlBeanFactory(new ClassPathResource("MyBean.xml"))`的实现原理,即IoC容器是如何初始化的。本文要学习的是`MyBean myBean = (MyBean)bf.getBean("myBean");`的实现原理,一般称其为**bean的加载**。

2018-06-01 23:17:05 350

原创 (一)Spring IoC源码-1.容器的初始化-07总结

以上几篇文章已经详细介绍了IoC容器的初始化过程,本文来对这个过程做个总结。Spring IoC容器的初始化过程主要包括以下几个步骤:获取Resouce实例。加载XML配置文件,封装成Resouce实例。这时Resouce实例中已经有了配置文件的路径等信息。获取Document实例。通过Resource,读取XML配置文件,封装成Document实例。这时Document实例中已经有了...

2018-05-31 22:50:22 240

原创 (一)Spring IoC源码-1.容器的初始化-06自定义标签的解析

在(一)IoC源码-04注册BeanDefinitions一文中,了解到Spring对于默认标签和自定义标签的处理方式是不同的。protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { //如果元素是默认标签,按照处理默认标签的方式来处理 if (de...

2018-05-31 08:15:35 251

原创 (一)Spring IoC源码-1.容器的初始化-05默认标签的解析

默认标签的解析是在org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(Element, BeanDefinitionParserDelegate)方法中处理的。private void parseDefaultElement(Element ele, Be...

2018-05-30 08:07:38 324

原创 (一)Spring IoC源码-1.容器的初始化-04获取并注册BeanDefinitions

在文章IoC源码-容器的基础的末尾,我们讲到从XML中加载Bean定义分为两个步骤来完成的。加载Xml文件,并封装成Document 实例。根据Document实例注册Bean信息。上文IoC源码-获取Document实例已经介绍了如何“加载Xml文件,并封装成Document 实例”。本文将详细讲解如何“根据Document实例注册Bean信息”。org.springframe...

2018-04-02 22:11:46 313

转载 基于ZooKeeper简单实现分布式锁

这里利用zookeeper的EPHEMERAL_SEQUENTIAL类型节点及watcher机制,来简单实现分布式锁。 主要思想:开启10个线程,在disLocks节点下各自创建名为sub的EPHEMERAL_SEQUENTIAL节点;获取disLocks节点下所有子节点,排序,如果自己的节点编号最小,则获取锁;否则watch排在自己前面的节点,监听到其删除后,进入第2步(重新检测排序...

2018-03-30 23:26:02 271

原创 Redis札记

Redis介绍什么是ReidsRedis 是一个基于内存的高性能key-value数据结构存储系统。Redis应用数据库、缓存和消息中间件Redis与其他key-value产品相比Redis支持数据的持久化。可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。Redis支持多种数据类型。Redis不仅仅支持简单的key-value类型的数据,同时

2018-01-31 23:37:32 659

原创 Netty札记-为什么要学习Netty

在学习Netty之前,有必要了解下我们为什么要学习Netty。什么是NettyNetty User guide for 4.x中这样介绍 Netty是一个提供异步事件驱动的网络应用框架,是一个用以快速开发高性能、可扩展协议的服务器和客户端的工具。 换句话说,Netty 是一个 NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Net

2018-01-27 22:48:56 5279 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除