自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

毅本无言的成长之路

深耕代码,顽固生长

  • 博客(22)
  • 问答 (1)
  • 收藏
  • 关注

原创 Spring源码学习(四)——ClassUtils.forName()

接上一篇,本篇针对ClassUtils.forName()方法进行研究。源码是这样事儿的:public static Class<?> forName(String name, ClassLoader classLoader) throws ClassNotFoundException, LinkageError { Assert.notNull(name, "Nam...

2018-06-21 13:13:55 5761 5

原创 spring aop

AOP是spring框架提供的非常重要的功能,让开发者可以非常方便地实现面向切面编程。一、AOP简介AOP(面向切面编程)可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,从而让开发者可以大幅度解耦代码,建立良好的代码结构。但当我们需要在大量的对象中引入公共行为的时候,OOP就无法方便的帮我们完成了。因为OOP描述的是一种层次关系,不是一种切面关系。例如,我们使用OOP完成了业务逻辑的开发,但是当我

2021-08-01 18:28:41 133

原创 性能火焰图

在遇到线上故障的时候,我们经常会去看一些系统指标,来探查故障发生的原因。其中,性能火焰图是一个非常有用的工具,能够帮助我们很快的发现CPU耗时分布,分析系统性能。1. 火焰图介绍火焰图(Flame Graph)是由Linux调优大师Brendan Gregg创造的,用于对系统性能进行更为直观的全局分析,引起形状形似火焰,因此被命名为火焰图:火焰图是由一系列调用堆栈组成的,其堆栈信息是采样得到的。火焰图有如下特点:图中每一列是一个调用栈,一个单元格代表一个函数(一个栈帧)y轴表示堆栈深度,自.

2021-05-23 19:08:54 492

原创 spring bean生命周期管理

spring bean生命周期,spring框架老生常谈的话题,也是spring的基础知识。借此篇文章,结合spring框架部分源码,对spring针对bean的生命周期管理进行一个总结,加深记忆。1. 概述1.1 何为bean在讲解bean的周期之前,我们先了解下什么是bean。自我们接触java开始,bean就无处不在。那么bean是什么?这里有两种解释,一种是狭义的,一种是广义的。在解释前,先简单介绍下bean的历史背景。1.1.1 bean的来源与发展在java诞生后不久,开发者为了让.

2021-02-22 16:20:49 683

原创 spring与xml schema

本文从自定义spring配置文件入手,介绍了spring配置文件头的原理,和spring.schema、spring.handlers两个文件的作用。下面是一个简单的spring配置文件。我们可以看到,xml文件的前几行这些配置,其实都是xml 结构的定义,通过引入这些定义,使xml文件中的标签可以正常被解析。<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/sch.

2021-02-15 18:32:32 316 1

原创 6. thrift服务层

文章目录1.服务端1.1 TSimpleServer1.2 TThreadPoolServer1.3 AbstractNonblockingServer1.4 TNonBlockingServer1.5 THsHaServer1.6 TThreadedSelectorServer2. 客户端3. 总结服务层是我们介绍thrift的最后一层,之前也介绍过,服务层的功能是将其他几个层进行聚合,以实现几层之间的功能上的耦合。我们从客户端和服务端两个方面来介绍服务层,二者都有一个核心的类:客户端:TServi

2020-06-15 00:04:31 410

原创 5. thrift传输层

文章目录1. TTransport结构2. TTransport子类3. TTransport实现原理4. 总结在前面的文章中,我们按照thrfit的调用顺序介绍了处理层和协议层,这篇文章我们接着介绍。我们回到TPotocol的源码: /** * Prevent direct instantiation */ @SuppressWarnings("unused") private TProtocol() {} /** * Transport */ protect

2020-06-07 21:59:11 1233

原创 4.协议层

上一篇我们介绍到,服务端在调用处理层时,会调用处理层中Processor的process方法,该方法的请求参数中包含TProtocol对象,同时,客户端的client对象在构造方法中也需要传入TProtocol参数,在处理层中,客户端写入rpc接口的请求参数、获取返回结果、服务端获取请求参数、返回方法结果,最终都交给了TProtocol来进行。之前我们介绍过,thrift的协议层负责的任务就是根据用户指定的协议,将请求参数和返回结果进行序列化/反序列化,实现不同系统之间无障碍识别数据的目的。本篇我们来深入T

2020-06-01 23:30:55 346

原创 3.处理层

从本篇开始,我们一层一层对thrift源码进行解读。从前文可知,Processor层是由idl编译而来,主要是进行数据流转,将协议层解析好的数据交由真正的服务去做,并将服务返回的数据交给协议层进行序列化处理。为了保证约定的一致性,处理层的代码会在客户端和服务端被同时引入,为客户端提供代理类,为服务端提供接口供其实现。我们先看下上一篇生成的HelloService的结构:根据功能我们可以将其大致分为三个部分: 接口功能部分:Iface/AsyncIface/Client/As..

2020-05-19 22:35:00 438

原创 2.thrift使用

我们使用thrift,写一个helloservice,它有一个方法sayHello,这个方法有一个参数word,它的功能就是在word后面添加一个hello然后返回,这也是服务端要做的事情;客户端拿到返回结果后打印出来。我们一步一步写一下: 编写idl service HelloService{ string sayHello(1: string word);} 我们用thrift编译器编译一下,这里有两种选择,我们可以使用thrift官方提供的编译器:http:

2020-05-19 22:29:32 329

原创 1.thrift概述

目录1.thrift简介2.thrift特性3.thrift架构1.thrift简介thrift是一款轻量级的跨语言RPC框架,其最初由Facebook开发并开源,后来上升至apach顶级项目,MTthrift就是基于thrift开发而来2.thrift特性thrift主要有以下特性: 接口描述语言:在thrift中,所有接口及相关参数都需要通过接口描述语言(IDL)在.idl文件中描述,该idl文件可以被生成器转化为不同语言,从而实现跨语言且具有强可读性,且可以十分清晰地

2020-05-19 22:24:11 438

原创 0.RPC简述

概念RPC(Remote Procedure Calls,远程过程调用),是一种进程间的通信方式,其强调的点在于“远程”,即通过该种方式,能够让我们像本地调用一样实现与远程进程的通讯。通俗一点来说,同样一个方法A,在没有使用RPC的时候,我们只能在本机器上调用该方法;使用RPC之后,A方法的代码在另一台机器上运行,但是我们也可以使用本机通过RPC对A方法进行调用意义业务规模的不断增大,给技术团队带来的影响主要有以下几个: 团队成员规模不断扩大 技术栈(尤其是语言栈)不断复杂并

2020-05-19 22:21:56 207

原创 Spring源码学习(八)——Spring.Beans(五)

上一篇文章将xml的验证介绍完毕,这篇介绍doLoadBeanDefinitions方法实现的第二个功能,根据传入的inputSource创建相应的Document对象,这一功能是通过Document doc = this.documentLoader.loadDocument( inputSource, getEntityResolver(), this.errorHan...

2020-03-15 12:11:15 133 1

原创 《Java8实战》读书笔记--第三章

文章目录内容概要1. lamda的使用方法内容概要本章内容主要由4部分组成:lamda的使用方法类型检查、类型推断及限制方法引用1. lamda的使用方法lamda表达式由三个部分组成参数列表(语法:(类型 变量名),如果仅有一个变量,基于lambda的类型推断,可省略类型,如:(e)->e.getValue())箭头lamda主体函数式接口函数式接口是...

2020-03-15 12:10:06 125

原创 《Java8实战》读书笔记-第一、二章

本章标题是“为什么要关心Java8”,主要是本书前两章的读书笔记

2020-02-05 18:05:59 228

原创 《Java8实战》读书笔记-为什么要学?

编程语言是我们开发者最重要的工具, 计算机科学理论的发展、计算机硬件的革新和开发技术的迭代都推动着编程语言的进步。从2014年JDK8正式发布到今年三月份JDK14即将发布,这6年时间里。java通过修复bug、优化原有实现和引进新特性在竞争激烈的编程语言领域中捍卫着自己的地位。为什么要看这本书...

2020-01-12 13:44:36 118

原创 Spring源码学习(七)——Spring.Beans(四)

上一篇说到loadBeanDefinitions这个方法主要干了三件事儿,第一件是获取xml文件的验证模式;第二件是加载xml文件,获得对应的Document;第三件是对bean信息进行注册。本篇先对第一件事进行介绍。 在程序中如何判定某个文件是xml文件,只凭后缀肯定是不行的,只有对文件中的格式进行验证,才能证明确实是xml文件,这也为接下来的程序提供了保障。常用的验证模式有D...

2018-07-04 17:28:28 198

原创 Spring源码学习(六)——Spring.Beans(三)

在XmlBeanFactory构造方法中,调用了XmlBeanDefinition的loadBeanDefinition(Resource resource)方法,这个是IOC容器对xml配置文件进行读取和解析的入口,那么进去看:public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreEx...

2018-06-25 13:37:06 214

原创 Spring源码学习(五)——Spring.Beans(二)

接上一篇,我们通过ClassUtils.forName()方法完成了对依赖注入接口的加载,接着DefaultListableBeanFactory实例化了一个静态map,这个map用于存储bean工厂实例和序列化id的映射关系。这个流程结束后,XmlBeanFactory的类初始化完成,然后就进入它的构造方法了。1.再看一下Demo中构造方法的参数,是一个ClassPa...

2018-06-21 14:38:01 229

原创 Spring源码学习(一)—工具准备和环境搭建

一、为啥杠上你了,spring 马上研究生就要毕业了,之前自己的技术一直感觉非常渣,渣的自己见到代码都恐惧,因为没有自信去写代码,写出来的代码也没有任何成就感。虽然现在技术仍然很渣,但是现在有点不要脸了,渣就不要脸的先用,然后不要脸地再学呗。抱着这个心态,开始了自己技术学习的漫漫成长路。 阅读源码,和大师的作品进行面对面的交流,我觉得这是个非常好的学习方式。spring,这个神...

2018-06-20 18:39:44 266

原创 Spring源码学习(二)—spring概览

1.spring特性 一提到spring,想到最多的就是IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程),这两个特性不仅让spring框架风靡全球,更是改变了整个行业,所有java开发工程师甚至其他工程师,都开始直接或间接地学习并使用spring的这两大特性,高内聚和低耦合,一切资源变得合理、简单...

2018-06-20 18:39:28 205

原创 Spring源码学习(三)—spring-Beans(1)

从这篇起,正式开始对spring源码的阅读和学习。根据书上的流程,先对spring核心容器模块中的Beans模块下手。对于beans包来说,有两个非常核心的类,第一个是DefaultListableBeanFactory,该类实现默认的对bean的注册和加载,这也是控制反转特性的最基本的功能,第二个类是XmlBeanDefinitionReader,该类提供了spring的IOC容器中对x...

2018-06-20 18:37:55 1111

空空如也

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

TA关注的人

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