- 博客(201)
- 收藏
- 关注
原创 面试题总结
你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 并且可以(可选地)将它映射到一个 JDBC 类型。比如:} }</使用上述的类型处理器将会覆盖已有的处理 Java String 类型的属性以及 VARCHAR 类型的参数和结果的类型处理器。
2023-04-04 21:13:45
582
原创 简历问题总结
SpringAop的实现方式是通过一个bpp生成代理类,代理类中的方法会调用一个DynamicAdvisedInterceptor的intecept()方法。而DynamicAdvisedInterceptor中具有Aop代理的拦截器链,会依次执行拦截器链,最后执行实际的方法逻辑,然后返回。监控报警查询物料接口超时两秒的比例上升,使用arthas定位问题。
2023-04-04 21:12:04
576
转载 Spring Validation最佳实践及其实现原理,参数校验没那么简单
之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation。本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底! 项目源码:spring-validation简单使用Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernate validation是对这个规范的实现,并增加了校验注解如@Email、@Length等。
2022-05-14 09:51:10
528
原创 maven插件开发
开发maven插件什么是mavenMaven实际上只是一个 Maven 插件集合的核心框架。换句话说,插件是执行大部分实际操作的地方,插件用于:创建 jar 文件、创建 war 文件、编译代码、单元测试代码、创建项目文档等等。几乎所有你能想到的对项目执行的操作都被实现为 Maven 插件。插件行为可以通过一组独特的参数来定制,这些参数由每个插件目标(或 Mojo)的描述公开。什么事MojoMojo(Maven-old-Java-object) 实际上只是 Maven 中的一个目标,插件由任意数量的
2022-04-25 18:03:48
831
原创 idea插件开发教程
主要的插件类型UI主题插件自定义语言支持插件框架集成插件工具集成插件开发插件的三种方式Using GradleUsing GitHub Template在github上选择一个模板,会自动根据模板生成一个配置好的插件项目,可以直接clone到本地开发Using DevKit使用DevKit开发插件设置开发环境准备工作确认启用Plugin DevKit插件,该插件是IDEA自带的插件为项目配置IntelliJ Platform SDK创建一个ntelliJ Platf
2022-03-28 09:58:18
3772
原创 Eureka源码分析
Eureka架构图Eureka核心功能点服务注册(register):Eureka Client会通过发送REST请求的方式向Eureka Server注册自己的服务,提供自身的元数据,比如ip地址、端口、运行状况指标的url、主页地址等信息。Eureka Server接收到注册请求后,就会把这些元数据信息存储在一个双层的Map中。服务续约(renew):在服务注册后,Eureka Client会维护一个心跳来持续通知Eureka Server,说明服务一直处于可用状态,防止被剔除。Eureka
2022-03-25 15:53:09
1849
原创 kafka学习笔记之概览
介绍Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢?我们知道流处理平台有以下三种特性:可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。可以储存流式的记录,并且有较好的容错性。可以在流式记录产生时就进行处理。Kafka适合什么样的场景?它可以用于两大类别的应用:构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka
2021-04-09 14:51:13
117
原创 flume学习笔记
flume体系结构数据流模型Event是Flume定义的一个数据流传输的最小单元。Agent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)学习Flume必须明白这几个概念,Event英文直译是事件,但是在Flume中表示数据传输的一个最小单位。参照下图可以看得出Agent就是Flume的一个部署实例, 一个完整的Agent中包含了三个组件Source、Channel和Sink,Source是指数据的来源和方式,
2021-04-08 17:39:42
211
原创 logback学习笔记
logback核心组件Logger:AppenderLayoutLoggerpackage org.slf4j; public interface Logger { // Printing methods: public void trace(String message); public void debug(String message); public void info(String message); public void warn(String mes
2021-04-08 10:17:51
504
原创 Request+Unittest接口测试框架基础搭建
request库基本使用发送get请求# 1、GET请求r = requests.get('https://httpbin.org/ip')print(r.text)# 1.1 发送GET请求,带参数#等同于直接访问https://httpbin.org/get?name=mikezhour = requests.get('https://httpbin.org/get', params={'name': 'mikezhou','age':18})print(r.text)# 1.2
2021-04-07 22:39:42
548
原创 python学习笔记之unittest
unittest单元测试框架不仅可以适用于单元测试,还可以适用接口测试、Web自动化测试等,它有一个很重要的特性:它是通过类(class)的方式,将测试用例组织在一起。unittest框架核心要素Unittest框架中最核心的四个概念是:test case, test suite, test runner, test fixture。unittest框架常用模块unittest.TestCase:TestCase类,所有测试用例类继承的基本类unittest.TestSuite():unit
2021-03-18 23:14:36
179
原创 python笔记之多线程
并发和并行在多核cpu中,每个核中同时运行一个线程,这种叫并行,强调的是同时运行。在一个cpu中,短时间内多个线程交替执行,这种叫并发,同一时刻只能执行一个线程。多线程模块在Python 3标准库中,有两个模块_thread和threading可以提供多线程支持。但由于_thread是低级模块,很多功能还不完善,一般只会用到threading这个比较完善的高级模块,因此这里只讨论threading模块的使用。Python中使用线程有两种方式:函数或者用类来包装线程对象。...
2021-03-08 23:09:37
296
1
原创 python学习笔记之面向对象编程
面向对象的三大特征封装,继承,多态新式类和经典类# 经典类class ClassNameA: '''类的帮助信息''' #类文档字符串 pass# 新式类,继承object类,推荐使用这种方式class ClassNameC(object): '''类的帮助信息''' #类文档字符串 passgetattr() setattr() hasattr()方法class Hero(object): def __init__(self,name):
2021-02-26 18:55:17
103
原创 python读书笔记之迭代器和生成器
可迭代对象可迭代对象可以使用for循环遍历取值, 比如:列表、元组、字典、集合、range、字符串。可迭代对象必须实现__iter__()魔法函数from collections.abc import Iterableprint(isinstance([],Iterable)) # 判断列表是否是可迭代对象print(isinstance((),Iterable)) # 判断元组print(isinstance({},Iterable)) # 判断集合print(isinstance("
2021-02-21 21:42:08
318
原创 python学习笔记之装饰器
闭包def print_msg(): # print_msg是外函数 msg = "I'm 狂师" def printer(): # printer是嵌套函数 print(msg) return printer # 返回嵌套函数printerdef func(a, b): def line(n): nonlocal a # nonlocal用于声明变量a是外围函数的变量 a = a + 1 ret
2021-02-21 11:49:32
275
2
原创 数据结构之链表
单链表你应该可以发现,其中有两个结点是比较特殊的,它们分别是第一个结点和最后一个结点。我们习惯性地把第一个结点叫作头结点,把最后一个结点叫作尾结点。其中,头结点用来记录链表的基地址。有了它,我们就可以遍历得到整条链表。而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址 NULL,表示这是链表上最后一个结点。next是后继指针。添加和删除结点循环链表循环链表是一种特殊的单链表,循环链表的尾结点指针是指向链表的头结点。和单链表相比,循环链表的优点是从链尾到链头比较方便。当要处理的数据具
2021-02-19 16:46:48
525
原创 数据结构之数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。特点一 线性表第一是线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。特点二 连续的内存空间和相同类型的数据正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“
2021-02-09 13:07:27
408
原创 空间复杂度分析
前面我讲过,时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系。void print(int n) { int i = 0; int[] a = new int[n]; for (i; i <n; ++i) { a[i] = i * i; } for (i = n-1; i >= 0; --i
2021-02-05 08:17:46
132
原创 时间复杂度分析
时间复杂度的由来其中,T(n) 我们已经讲过了,它表示代码执行的时间;n 表示数据规模的大小;f(n) 表示每行代码执行的次数总和。因为这是一个公式,所以用 f(n) 来表示。公式中的 O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。所以,第一个例子中的 T(n) = O(2n+2),第二个例子中的 T(n) = O(2n2+2n+3)。这就是大 O 时间复杂度表示法。大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时
2021-02-05 08:13:14
533
1
原创 python读书笔记二
csv模块import csvfile_name = 'aaa.csv'with open(file_name) as f: reader = csv.reader(f) # 返回文件的阅读器对象 header = next(reader) # csv模块中的next函数,返回文件的下一行 datetime模块from datetime import datetime # 导入datetime模块中的datetime类date = datetime.strptime('2014-7-1'
2021-01-27 19:46:21
81
原创 python学习笔记1
变量变量名由字符、数字、下划线组成。用下划线分隔变量名。python数据类型字符串,单引号或双引号括起来。title()方法,把首字母变大写;upper()、lower()方法。数字,包括整数和浮点数。数字和字符串不能直接用+号连接,需要使用str()函数转换成字符串。3 ** 2 表示3的平方。列表## 定义一个列表persons = ["zhangsan","lisi"]print(persons)# 取值person = persons[0], # 索引为-1时标识取最后一个
2021-01-24 14:39:13
593
1
转载 分布式事务解决方案
原文链接关于分布式事务,XA协议的学习笔记XA分布式事务协议,包含二阶段提交(2PC),三阶段提交(3PC)两种实现。1、二阶段提交方案:强一致性事务的发起者称协调者,事务的执行者称参与者。处理流程: 1、准备阶段 事务协调者,向所有事务参与者发送事务内容,询问是否可以提交事务,并等待参与者回复。 事务参与者收到事务内容,开始执行事务操作,讲 undo...
2020-04-07 11:53:43
148
原创 springcloud读书笔记三 SpringcloudConfig
快速入门创建git仓库创建config服务端创建客户端加密解密动态刷新配置在git仓库对push事件设置一个webhook,当有代码push时,访问注册中心的一个接口 注册中心收到请求后通过springcloud-bus向消息队列的特定的topic发送一个refresh事件 所有的服务都通过springcloud-bus订阅消息队列的这个...
2020-04-05 22:09:34
136
原创 springcloud读书笔记二 OpenFeign
Ribbonserver.port=8081spring.application.name=consumer-serviceeureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/#ribbon,制定服务配置,默认配置类为DefaultClientConfigImplribbon.ConnectTimeou...
2020-04-05 17:17:10
497
原创 springcloud读书笔记一 Eureka
如何使用启动注册中心集群启动服务提供者客户端注册Eureka中的概念自我保护机制默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,...
2020-04-04 17:13:23
289
原创 mysql优化
建表优化避免设计可为NULL的列,这会使mysql处理索引处理更麻烦,但是在调优时没必要优先优化这个问题。 使用合适的数据类型,例如存储整数较小时可以使用tinyint,varchar选择合适的长度 关联列选择相同的数据类型 数据量比较大时使用索引已经不起作用,可以使用分区,根据分区函数或者某个字段进行分区。索引优化查询语句优化避免使用select *,尽量利用覆盖索引避免查表...
2020-03-29 21:56:19
120
原创 dubbo源码导读三 dubbo服务引用过程
1. 简介上一篇文章详细分析了服务导出的过程,本篇文章我们趁热打铁,继续分析服务引用过程。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,...
2020-03-29 18:36:46
196
原创 dubbo源码导读二 dubbo服务暴露过程
Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析。实现细节概览解析服务基于 d...
2020-03-29 12:22:44
169
原创 dubbo源码导读一 dubboSPI自适应扩展
dubbo SPIdubbo自适应扩展机制自适应拓展类加载过程加载入口方法加载@SPI接口所有的实现类,如果有实现类有@Adaptive注解,则直接返回此类。 判断@SPI接口中的方法是否至少有一个方法具有@Adaptive注解,如果没有,则抛异常。 通过反射获取接口的方法数组,然后遍历数组生成代理类内部代码。 对于没有@Adaptive注解的方法,生成的代...
2020-03-28 15:56:12
155
原创 ArrayList的扩容
默认底层容量为10,但是第一次add元素的时候,会首先扩容一半,即15 当准备向list中添加第16个元素的时候,会触发第二次扩容,依次类推。
2020-03-27 17:58:05
557
翻译 高性能mysql读书笔记五 优化查询
查询执行过程通信协议查询线程状态查询缓存优化器mysql如何执行关联查询排序优化查询执行引擎返回结果给客户端查询优化器的局限性关联子查询Union的限制Min()和Max()优化在同一个表上查询和更新优化特定类型的查询优化count()优化关联...
2020-03-25 12:10:44
115
翻译 高性能mysql读书笔记四 创建高性能索引
索引的类型B-Tree索引小技巧: 查询条件中的范围条件放在最后,否则范围条件之后的条件无法使用索引。Hash索引全文索引索引的优点高性能索引策略独立的列前缀索引和索引选择性多列索引聚簇索引覆盖索引使用索引排序索引和锁...
2020-03-24 22:56:16
95
翻译 高性能mysql读书笔记三 Schema与数据类型优化
避免使用NULL数据类型整数类型实数类型字符串类型日期和时间类型位数据类型(略)关联列选择相同数据类型特殊类型数据优化Alter Table...
2020-03-24 16:39:11
132
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人