![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 73
坤少_jkson
别再用廉价的勤奋掩饰你的懒惰
展开
-
Mybatis的插件管理怎么处理的
1. 原理MyBatis可以帮助我们在语句执行过程中的某一点进行拦截调用。它的实现原理就是插件采用责任链模式,通过动态代理组织多个拦截器(插件)将四大核心对象进行拦截增强变成个代理对象,从而可以改变Mybatis的默认对象的行为(诸如SQL分页改写,统计性能,打印日志等),mybatis源码环境搭建参考,通过mybatis的源码分析,我们可以更清楚的了解到策略模式和动态代理模式是如何使用的,后续在代码逻辑中可以借鉴2. 流程图3. 代码示例 <plugins>原创 2021-01-31 17:19:49 · 98 阅读 · 0 评论 -
本地缓存小计
1.概念 本地缓存,在我们日常开发中是必不可少的一种解决数据读取性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间,SpringBoot 1.x版本中的默认本地cache是Guava Cache。在2.x(Spring Boot 2.0(spring 5))版本中已经用Caffine Cache取代了Guava Cache。毕竟有了更优的缓存淘汰策略。这2个都是线程安全的,可以指定容量,多种过期策略,主要特性是将数据写入缓存时是原子操作。当缓存的数据达到最大规模时...原创 2021-01-24 18:14:50 · 166 阅读 · 0 评论 -
使用枚举来巧妙干掉if-else,使代码更加优雅
导读:本文通过一个简单的例子来展示如何通过枚举巧妙地干掉if-else,使代码看起来更佳优雅。场景:当我们接收到一些数据需要对其进行处理时,由于它们来自于不同的渠道(如:腾讯,头条),不同渠道所需的处理方式不同,下面我们写一个简单Demo来实现该的场景。解决思路1、首先构建一个 GeneralChannelRule 基础规则抽象类,定义一个抽象方法process(),不同的渠道都需要实现该抽象方法。public abstract class GeneralChannelRule..转载 2021-01-01 17:07:02 · 334 阅读 · 0 评论 -
从 Java 内存模型看内部细节
写在前面Java 内存模型简称 JMM,其实是一个抽象模型,并非具体的存在。如上图想表达的,线程的读写都是直接跟 work memory 打交道,CPU 会通过一种机制将数据 flush 到 main memory 中。那么在 flush 发生之前,不同 CPU 之间就会出现可见性的问题,这很好理解。熟悉 Java 的大概都知道volatile关键字是用来解决内存可见性和指令重排序问题的,我们往往知道这两点,但却不知道其中的关联。关于 volatile 也有很多人误认为这是 Java 的特色..转载 2020-12-17 00:04:39 · 140 阅读 · 0 评论 -
java集合对象排序总结
java集合对象按照某个属性进行排序有很多种方式,下面简单记录下1对象实现Comparable接口中的compareTo 方法,然后通过Collections.sort进行排序2通过Collections.sort配合匿名内部类Comparator来处理(Java1.7或更早版本的JVM不支持Lambda语法的情况下推荐使用这种)或通过List接口的(JDK1.8默认实现方法)Collections.sort(list, new Comparator<Order1>()...原创 2020-12-02 00:41:50 · 624 阅读 · 0 评论 -
日志几点思考
在系统中经常会加很多必要的日志来帮忙我们定位分析解决问题,虽然这个日志挺简单,但是真的很重要,下面从几个方面来总结下 1.日志框架的来源 java有很多现成的日志框架,我们可以借鉴学习源码和设计思想,可参考之前转载的文章https://blog.csdn.net/jiangzhexi/article/details/80771163 2.日志打印规范 2.1日志分级:像log4j2有8个日志级别,按照从低到高为:ALL < TRACE < DEBUG ...原创 2020-09-13 00:23:11 · 145 阅读 · 0 评论 -
JSON序列化小计
项目中经常需要对象转成json字符串,json串转对象,一般经常用fastjson,gson,以及springboot默认支持的jackson,由于fastjson爆出漏洞太频繁,新项目一般建议用gson或jackson,也可以用protostuff来做,protostuff的性能比较好,具体benchmark可以参考https://github.com/eishay/jvm-serializers/wiki,如果想提供多种工具类可以定义统一的接口采用SPI的机制,通过SPI可以对外提供多种选...原创 2020-07-16 23:39:47 · 155 阅读 · 0 评论 -
java异步任务执行ListenableFuture
1.业务场景 在实际应用中 我们在优化一个方法的性能时通常会考虑使用多线程,比如网站单品页会后台调用诸如商品,库存,优惠券,促销,风控等特别多的接口,如果都串行调用接口会很慢(相当于各个rpc的执行时间),为了提高方法的性能,我们会用并行去调用各个RPC接口,有的接口会有依赖关系,既调用A接口,拿到结果再去调用B接口,如果我们想调用完一个RPC接口后直接去调用另外一个接口,或者调用完一个RPC接口后增加个回调函数做其它动作该怎么去处理 2.方案分析 Fu...原创 2020-06-21 18:28:07 · 1922 阅读 · 0 评论 -
HashMap在JDK8前后的区别
背景 目前,部门的很多JAVA项目使用的还是JDK7,其实JDK8的升级进行了很多优化,而且目前最新的JDK版本已经已经到了JDK12,版本帝真的很可怕。其实也不用很慌,因为从JDK9开始就是每半年发布一个版本,2019年JDK就会到JDK13,更多的关注重大功能变更就好了。但是对于HashMap来说,JDK8的优化还是有可以看一下源码的意义的,本文的目的就是针对于这个优化画一下重点。JDK7的HashMap原理 在JDK7中,HashMap的实现方式是数组+链表。...转载 2020-05-14 18:58:53 · 630 阅读 · 0 评论 -
重新认识AOP(二)
1.使用场景 项目中比如日志,事物,方法调用监控,自定义链路监控等场景都需要在方法的执行前后加一段代码处理逻辑,如果都在业务类里进行写的话,代码会出现很多冗余重复的代码.比如下面这种在方法执行前后增加日志,考虑采用插桩机制避免这种重复代码 public void testInfo(String param){ log.info("before invoke,...原创 2020-05-03 15:53:40 · 228 阅读 · 0 评论 -
org.apache.catalina.LifecycleException: A child container failed during start
1.问题产生 在开发一个需求的时候需要引用二方包,引入后起来报下面的错误,项目是springboot-1.4.5,下面是截取部分日志,关键日志 Unable to start embedded Tomcat 该异常出现在TomcatEmbeddedServletContainer类中2020-04-23 17:20:34.217 [main ] [,,] ...原创 2020-04-25 22:49:58 · 3814 阅读 · 0 评论 -
springboot加载配置项application.yml的优先级
我们在用springboot开发项目的时候,我们在线上或预发部署的时候,经常需要把这个文件application.yml提出来,然后根据不同分组配置不同的配置项,比如配置日志参数等,比如我代码的appliction.yml(配置文件路径在–file:./config/)的有个日志配置项配置的级别是debug,然后如果我再线上分组也提出来个appliction.yml(路径是–file...原创 2020-04-21 00:37:09 · 3978 阅读 · 1 评论 -
Java线程池实现原理及其在美团业务中的实践(转载加总结)
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案...转载 2020-04-04 11:04:52 · 422 阅读 · 0 评论 -
Guava工具之BloomFilter
我们都知道Guava提供了很多有用的工具包,比如Guava cache,Guava中令牌桶实现RateLimiter,Google Collections,又比如使用guava的Lists.partition,Lists.transform做分割转换工具,我们都可以在github上把源码下载下来进行详细的解读, 下载地址如下https://github.com/g...原创 2020-03-22 22:21:36 · 623 阅读 · 0 评论 -
学习Mybatis源码
在周末没事的时候,可以学习下Kafka,Mybatis,Tomcat,Spring,Zk,springBoot等源码,从中可以学习到很多东西,比如里面用到哪些设计模式,项目架构,优秀代码示例,这对我们工作中 开发代码或排查定位问题都会提供一定的帮助。1.新建demo项目搞个简单的增删改查就行,这个很简单(不会的网上查下)然后同时把源码也从github上下载,下载地址见ht...原创 2020-03-14 16:58:07 · 433 阅读 · 0 评论 -
老大难的 Java ClassLoader,到了该彻底理解它的时候了
ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人。本文我带读者彻底吃透 ClassLoader,以后其它的相关文章你们可以不必再细看了。ClassLoader 做什么的?顾名思义,它是用来加载 Class 的。它负责将 Class 的字节码形式转换成内存形式的...转载 2020-02-21 23:18:29 · 121 阅读 · 0 评论 -
netty的Future异步回调难理解?手写个带回调异步框架就懂了
netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型。netty里面充斥了大量的非阻塞回调模式,主要是靠Future/Promise异步模型来实现的。Future是java.util.concurrent.Future,是Java提供的接口,可以用来做异步执行的状态获取,它避免了异步任务在调用者那里阻塞等待,而是让调用者可以迅速得到一个Futu...转载 2020-01-14 20:08:17 · 1597 阅读 · 3 评论 -
关于MySQL数据库超时设置感悟?
要时刻对线上系统保持敬畏之心,那么线上系统的JVM参数配置,数据库连接配置就得认真对待,不能疏忽1线上系统的数据库配置的参数的具体含义,以及该设置多大2线上系统对应的数据库最大支持的链接数是多少,通过压测能压到2000,还是5000 还是多少3apache的数据库连接池和阿里的DruidDataSource区别是啥。什么情况下该用哪个?4connectTimeout和socke...原创 2019-12-12 22:14:56 · 1401 阅读 · 0 评论 -
Java高并发程序设计笔记7之并发容器及典型源码分析
并发容器是针对多个线程并发访问而设计的,在jdk5.0引入了concurrent包,其中提供了很多并发容器,极大的提升同步容器类的性能。ConcurrentHashMap我们知道HashMap不是一个线程安全的容器,最简单的方式使HashMap变成线程安全就是使用Collections.synchronizedMap,它是对HashMap的一个包装public st原创 2016-11-20 17:34:24 · 464 阅读 · 0 评论 -
Java编码问题汇总
转自 http://www.blogjava.net/zhangchao/archive/2011/05/26/351051.html工作中经常遇到java编码问题,由于缺乏研究,总是无法给出确切的答案,这个周末在网上查了一些资料,在此做些汇总。 问题一:在java中读取文件时应该采用什么编码?Java读取文件的方式总体可以分为两类:按字节读取和按字符读取。按字节读取转载 2017-04-05 16:03:10 · 272 阅读 · 0 评论 -
多线程迁移redis数据笔记
背景: 出于项目改造的需要,需要把之前10台redis服务器的数据迁移到公司的存储上 业内,常见的redis数据迁移方式有以下三种:aof(日志文件)、rdb(快照文件)、replication(主从复制)。 见http://www.bitstech.net/2016/03/03/redis-migration/ 但是由于这次改动的特殊性只能自己根据规则去迁移,又因为我们用twem原创 2017-04-20 16:45:15 · 817 阅读 · 0 评论 -
RunTime.getRunTime().addShutdownHook用法
今天在阅读Tomcat源码的时候,catalina这个类中使用了下边的代码,不是很了解,所以google了一下,然后测试下方法,Tomcat中的相关代码如下: Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系转载 2017-05-16 17:58:57 · 199 阅读 · 0 评论 -
深入理解Java的接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解转载 2017-06-25 10:43:55 · 234 阅读 · 0 评论 -
guava使用Lists.partition,Lists.transform小结
有时候我们会遇到分割List,把list分成几份,或者把list的元素转换成另一个类型的元素,使用 guava的Lists.partition,Lists.transform可以帮忙我们更加简单的实现此功能import com.google.common.base.Function;import com.google.common.collect.Lists;import java.ut原创 2017-10-10 10:33:43 · 4230 阅读 · 0 评论 -
JAVA中Long与Integer踩的坑
前几天在项目上看到代码2个Long型变量判断是否相等用的是==,代码在测试环境部署测试没有问题,放到预发环境就有问题,于是就在main进行了如下测试public class TestDemo { public static void main(String args[]){ Long a=50L; Long b=50L; Long c=5...原创 2018-05-20 16:15:30 · 5451 阅读 · 1 评论 -
mybatis中if判断把整数0识别为false(深坑)
1先看mybatis配置文件<select id="listByParam" resultMap="orderSettlePartnerResultMap" parameterType="com.jd.ept.settlement.domain.settle.OrderSettlePartner"> SELECT <include refid="all_ta...原创 2018-06-21 15:40:52 · 3692 阅读 · 1 评论 -
一个想休息的线程:JVM到底是怎么处理锁的?怎么不让我阻塞呢?(转自码农翻身)
我是一个线程,生活在JVM(Java虚拟机)中, 这一段日子过得有些无聊,整个世界似乎只有这一个人,天天忙着执行代码,想休息一下都很难。我听说人类写的代码中有些特殊的地方,叫做临界区,比如synchronized修饰的方法或者代码块,他们非常神奇,在同一时刻JVM老大只允许一个线程进入执行。实际上,老大设置了一把锁,抢到了这把锁就可以执行,否则只能阻塞,等待别人释放锁。老大说,阻塞就是不用干活了,...转载 2018-07-15 16:11:04 · 254 阅读 · 1 评论 -
myBatis多路径参数配置
项目中用到了myBatis多路径配置的情况,需要指定不同的路径去加载不同的配置文件,dao包等信息,配置如下:需要注意的是dao配置文件要和dao路径一样否则可能mybatis识别不了<!-- MyBatis配置 --> <bean id="sqlSessionFactoryBS" class="org.mybatis.spring.SqlSessionFact...原创 2018-08-16 18:02:10 · 1134 阅读 · 0 评论 -
AbstractProcessor如何开发测试?
我们在开发中会用到监控日志,或者权限校验等功能,一般我们都是通过AOP的动态代理来搞定,这个AOP动态代理一般也就是2种方式,一种是根据JDK的反向代理(基于接口),一种是基于cglib生成子类(基于asm)来搞定,这种动态代理就是在运行的时候通过接口或子类来进行代码增强, 其实还有一种方式就是编译代码的时候把监控日志代码或者权限校验植入进去,其实就是Abstra...原创 2018-12-18 11:32:37 · 1392 阅读 · 0 评论 -
CountDownLatch的使用
我们在写服务的时候,有时候需要利用线程池来批量作业,这个时候需要等全部作业处理完后统一返回,这种情况只能用CountDownLatch来处理了,比如下面的代码实例 @RequestMapping(value = "/demo4", method = RequestMethod.GET) public String demo4() throws Exception...原创 2018-12-19 10:40:29 · 122 阅读 · 0 评论 -
如何写出漂亮的好代码?
我们平常在做需求过程中,有的同学会按照面向对象的原则设计写出和框架代码一样高水平的代码,有的可能就是用面向过程的方式把需求给实现了,但是感觉不漂亮!也就是复用性比较差,修改一点地方容易导致别的地方出问题,扩展性也比较差,我觉得我们要写出漂亮的代码应该考虑下面几个因素1. 向对象的的基本特征:封装,继承,多态2. 类之间的关系:实现、依赖、关联、聚合(has-a)、组合(cont...原创 2019-06-07 00:06:51 · 1145 阅读 · 0 评论 -
junit源码之设计模式
我们做需求时候经常用junit单元测试,由于junit是一个Java测试框架,通过maven依赖直接就可以看到对应的源码,今天在看源码的时候发现用到了好多设计模式,我们平常不仅要看懂源码,还要理解设计理念,设计思想,其中用到的设计模式有命令模式,组合模式,模板方法模式,观察者模式,装饰器模式。包结构如下类图3总结对于Junit源码的设计模式的解释,网上一堆,但...原创 2019-08-15 14:43:01 · 319 阅读 · 0 评论 -
Java 8:不要再用循环了
正如我之前所写的,Java 8中的新功能特性改变了游戏规则。对Java开发者来说这是一个全新的世界,并且是时候去适应它了。在这篇文章里,我们将会去了解传统循环的一些替代方案。在Java 8的新功能特性中,最棒的特性就是允许我们去表达我们想要完成什么而不是要怎样做。这正是循环的不足之处。要确保循环的灵活性是需要付出代价的。return、break 或者 continue都会显著地改变循环的实转载 2017-04-12 22:11:54 · 453 阅读 · 0 评论 -
JAVA应用JVM原理及参数调优笔记
JVM是按照运行时数据的存储结构来划分内存结构的,JVM在运行Java程序时,将它们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据,运行时数据包括Java程序本身的数据信息和JVM运行Java需要的额外的数据信息,如下图所示1JMMJava内存结构,Java的主内存和私有内存什么是线程安全,你的预料结果和实际结果可能不一样一个主内存,3个线程原创 2016-11-06 21:51:37 · 1954 阅读 · 0 评论 -
10 行 Java 代码实现最近被使用( LRU )缓存
在最近的面试中,我曾被多次问到,怎么实现一个最近最少使用(LRU)的缓存。缓存可以通过哈希表来实现,然而为这个缓存增加大小限制会变成另一个有意思的问题。现在我们看一下怎么实现。最近最少使用缓存的回收为了实现缓存回收,我们需要很容易做到:查询出最近最晚使用的项给最近使用的项做一个标记链表可以实现这转载 2017-03-16 22:16:42 · 262 阅读 · 1 评论 -
线程池ThreadPoolExecutor使用简介
转载自http://blog.chinaunix.net/uid-20577907-id-3519578.html 这篇博客非常生动形象的解释了线程池的用法一、简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maximumPoolS转载 2016-11-17 13:29:17 · 248 阅读 · 0 评论 -
Java高并发程序设计笔记10之NIO和AIO
IO感觉上和多线程并没有多大关系,但是NIO改变了线程在应用层面使用的方式,也解决了一些实际的困难。而AIO是异步IO和前面的系列也有点关系。在此记录一篇文章来介绍NIO和AIO。1. 什么是NIONIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标 准。它是在Java 1.4中被纳入到JDK中的,并具有以下特性: NIO原创 2016-12-25 17:15:24 · 803 阅读 · 0 评论 -
Java高并发程序设计笔记9之并发设计模式
什么是设计模式 单例模式 不变模式 Future模式 生产者消费者 什么是设计模式 在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领 域引入到计算机科学的。 Richard Helm, Ralph原创 2016-12-21 22:01:03 · 2027 阅读 · 1 评论 -
SpringMvc 使用poi导入导出Excel
转载自http://webook-java.iteye.com/blog/1699621下面2个博客也不错,简洁明了http://www.cnblogs.com/littlecharacter/p/5580676.htmlhttp://blog.csdn.net/onepersontz/article/details/49891405Util类 package com.转载 2016-12-12 19:48:45 · 1361 阅读 · 0 评论 -
SpringMVC+POI下载文件模板和导出Excel
如果文件模板是固定的,直接放到服务目录下,然后可以用下面的代码下载(模板文件放到项目的webapp下,不要放到WEB-INF下) <a target="_self" href="/template/template.xlsx" >下载office模版</a> 如果是需要从数据库查询出来导出的,则参考下面的代码 @Reque...原创 2016-12-12 18:45:38 · 6310 阅读 · 0 评论