![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 77
Me_Liu_Q
苹果越分享越少,知识越分享越多。
展开
-
深度了解Netty
深度理解Netty模型原创 2024-01-23 17:35:57 · 975 阅读 · 0 评论 -
Netty底层设计架构
Netty-NIO设计模型原创 2023-12-12 16:45:17 · 83 阅读 · 0 评论 -
Java之JMX获取应用进程CPU/内存使用率,监控GC回收
Java之JMX获取应用进程CPU/内存使用率,监控GC回收原创 2022-12-22 17:23:33 · 2545 阅读 · 1 评论 -
ByteBuddy-Javaagent的使用
bytebuddy 之 javaagent的应用原创 2022-12-15 13:06:22 · 1322 阅读 · 1 评论 -
Java synthetic
笔记原创 2022-12-08 18:28:03 · 269 阅读 · 0 评论 -
Spring扫包,是否加载了扫包目录下的所有类至JVM?
Spring扫包原创 2022-10-18 15:40:45 · 340 阅读 · 0 评论 -
Spring 日志适配器
Spring适配各种日志框架原创 2022-10-18 14:40:37 · 182 阅读 · 0 评论 -
Java在不改变String内存地址的情况下修改内容
总所周知,Java的String类具有不可变性,因为它被final修饰了。我们在平常开发中,将String进行替换,或者其他操作,只要改变其内容,就会新创建一个String,原String保持不变。以下代码:将var1字符串abcd,替换成aBcd后,由var2接收,此时的var2是一个新的字符串。var1和var2的hashCode不一致。那么如何在不改变String地址(hashCode)的情况下,修改内容呢?通过反射去修改String类中 char[] value的值。以下代码表示出.原创 2021-08-10 22:53:36 · 1923 阅读 · 3 评论 -
JVM内存结构常见面试题
JVM内存结构常见面试题JVM内存结构布局虚拟机栈是什么?本地方法栈程序计数器方法区Java8的内存分代改进,为什么要改进?JVM堆有哪些区?分别作用什么?为什么要有新生代和老年代?新生代为什么要分成Eden,Survivor区?新生代为什么要有两个Survivor区?而且一个Survivor区一直为空?对象什么情况会进入老年代?新生代&老年代,Eden&Survivor 分配比例?TLAB(Thread Local Allocation Buffer)的作用?为什么有TLABTLAB是什么原创 2021-08-04 11:07:34 · 836 阅读 · 0 评论 -
MySql逆向工程(自定义实现MySql逆向生成Java实体类,包含Lombok注解,Swagger注解,Javax注解)
很多开发者用的 MySql逆向工程应该都是框架自带的(MyBatis),但他的效果可能达不到我们想要的效果,然后生成完代码之后,又要手动去去修修改改,甚是麻烦。这边说明下,我做的这个MySql逆向工程,仅有以下依赖,他是一个单独的模板。mysql-connector-java mysql 连接。fastjson 数据库查询的数据,转换成Java类型。lombok 懒得写 get/set。生成的Java实体类有什么功能?Lombok注解,需要开启。如果没有开启,则生成 get/set/.原创 2021-03-24 11:29:37 · 1439 阅读 · 0 评论 -
如何处理接口幂等性问题(重复提交)
接口幂等:多次请求,结果一致。同样的请求参数,多次去访问同一个接口,得到的结果是一致的。且服务端(针对于数据入库或数据修改)只处理一次。通俗点讲就是:防止重复提交。以下演示相关案例案例1: 数据表添加数据案例2:完成任务,领取奖励案例3:修改了其他线程已经修改的数据案例4:接口回调,且存在重试总结案例1: 数据表添加数据往数据库添加数据如下数据库(user),和服务端添加(user)数据接口。假如用同样的参数去调用添加(user)接口,那么每次都会往数据库插入一条数据,那么数据库就会有多条原创 2021-03-20 19:13:28 · 1943 阅读 · 0 评论 -
ArrayList于LinkedList的区别
本文主要讲解Java List集合ListArrayListLinkedListArrayList 内存占用LinkedList 内存占用List按添加顺序排列的集合,予许元素重复,且可以为 null。主要说下List下的两大常用子类ArrayList,LinkedList。ArrayList底层基于一个数组实现,数组长度可动态扩容。数组默认长度 10。‘LinkedList底层基于链表实现,不需要扩容。ArrayList 跟 LinkedList 有什么区别呢?增删查改的区原创 2021-03-14 23:12:54 · 162 阅读 · 0 评论 -
同时启动3个线程从1开始打印递增数字, 每次每个线程打印3次,且按线程顺序打印,打印到36程序结束
效果:线程1:1线程1:2线程1:3线程2:4线程2:5线程2:6线程3:7线程3:8线程3:9线程1:10线程1:11线程1:12…线程3:34线程3:35线程3:36实现 思路:基于 synchronized 的 wait, notifyAll同时开启三个线程,分别为这三个线程设置name,1 2 3.。定义一个共享的Runnable实现类。定义一把共享锁对象,或者使用 this锁对象。(必须是三个线程共享的锁)white循环,自增数num小于36。原创 2021-02-20 18:51:41 · 1133 阅读 · 0 评论 -
Java开发注意事项
分享/记录下在日常开发的碰到的问题及解决方案和开发过程的优化。值得一提的是,在今年 年中的时候我还是一个小白,懵懵懂懂的,每天利用业余时间,在网上寻找一些视频教程学习,进步还是有的。拓展了我的知识与见解,然后也理解到一句著名的话(知道的越多,不知道的越少)分享两个学习的网站,个人感觉是非常不错的,可以学到很多知识。尚硅谷,可白嫖,技术点很强,入门至高级。一定要去看看蚂蚁课堂,有免费的基础入门视频,高级篇需要付费同时,我也是蚂蚁课堂的付费学员。搞技术应该充分利用业余时间去找资料学习,拓展自己的原创 2021-02-01 18:12:45 · 194 阅读 · 0 评论 -
Unable to process parts as no multi-part configuration has been provided 解决方案
记录一个开发中的问题基于Servlet3.0开发,上传文件,httpServletRequest.getParts()报的异常在添加Servlet组件的时候,加上这么一项配置,setMultipartConfig(new MultipartConfigElement(""))public class MultipartConfigElement { // 上传文件的临时路径 用Tomcat默认值 private String location; // 上传文件最大原创 2021-01-22 16:03:42 · 8222 阅读 · 6 评论 -
Tomcat性能调优
资料来自:蚂蚁课堂,Tomcat性能调优此篇文章主要记录下学习的技能,方便后期查阅。Tomcat臃肿点默认加载了一些我们实际开发用不到的组件,例如:JspIO模型默认是APR,可能其他高版本是NIO默认启用了AJP,内部通讯的集群,一直有10个线程在执行。1:不需要视图层开发,也就是前后端分离,或者不需要Jsp的时候,关闭掉Jsp支持。在conf.web.xml中删掉以下两处配置。如果不需要ROOT目录的映射,还可以把DefaultServlet也删掉。2:在conf.we原创 2021-01-16 21:26:32 · 304 阅读 · 0 评论 -
SpringAOP分布式锁(可以适配redis,zk等多种中间件实现)
关于分布式锁,我也在网上找了很多文章,但始终没有找到一个我想要的解决方案,于是自己动手写了一个。什么是分布式锁:就是在多个服务端都能访问到的中间件上打上一个标记。例如:redis, zookeeper, mysql本文是基于redis 的 setnx 实现分布式锁,但是我写的分布式锁解决方案,还可以适配其他中间件实现。这个才是重点。先说下分布式锁需要解决的问题:有一个服务端获取到了锁,其他服务端是阻塞等待,还是直接以失败响应。获取锁失败,是否需要重试一会。锁必需要具备有可重入性质。服原创 2021-01-06 15:54:36 · 768 阅读 · 2 评论 -
SpringMVC核心组件之(HandlerAdapter)
url映射(HandlerMapping)的执行适配器在DispatcherServlet类中的initHandlerAdapters()初始化handlerAdapters。SpringMVC默认有三个HttpRequestHandlerAdapter, 该HttpRequestHandler接口的适配执行器SimpleControllerHandlerAdapter, 该Controller接口的适配执行器RequestMappingHandlerAdapter,处理@RequestMapp原创 2020-12-30 10:58:03 · 983 阅读 · 0 评论 -
layui 动态表格之合并单元格
因工作需要对 layui 的动态渲染表格合并,但是 layui 官方也没有给出解决方案,于是就在网上找了好久,终于找到一篇文章。layui 动态表格之合并单元格 感谢该作者提供的设置思路但是该文章提供的方案并没有起到效果,于是借鉴他的思路,对代码进行改进。效果图:在 table.render 的 done渲染成功事件中加入以下代码。注意点:merge_column_infos中的 index 索引从 0 开始(从左边数起)。$("#alert_table_div table").fin原创 2020-12-28 18:15:57 · 4033 阅读 · 9 评论 -
Spring后置处理器(BeanPostProcessor)(BeanFactoryPostProcessor)
Spring的后置处理器,在应用Spring框架开发中非常重要,Spring底层的核心,就通过各种后置处理器去完成IOC容器的启动,AOP代理对象的创建。Spring的后置处理器有两大类,BeanFactory与Bean。BeanFactoryBean 工厂方面的后置处理器BeanFactoryPostProcessor 获取IOC容器BeanDefinitionRegistryPostProcessor 向容器注册Bean...原创 2020-12-23 11:25:52 · 461 阅读 · 5 评论 -
Spring整合MyBatis纯注解开发
为什么要学习mybatis-spring注解版开发呢?可以帮助我们了解到mybatis在spring-boot中自动装配做了什么事情。1:环境搭建maven依赖:<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId&原创 2020-12-19 19:23:34 · 586 阅读 · 1 评论 -
自定义JDBC使用Spring事务
我们自己定义的JDBC如何使用Spring提供的事务管理呢?pom依赖<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.10.RELEASE&l原创 2020-12-19 17:51:56 · 163 阅读 · 1 评论 -
Spring 事务七大传播行为
@Transactional的属性:propagation,事务传播行为,枚举类型 Propagation。注意:事务传播行为在同一Service类中是无效的,只有在AService 调用 BService才有效。因为事务处理是通过AOP代理拦截工作的,在同一Service里调用,不会再触发代理方法拦截。这里写目录标题1:Propagation.REQUIRED,默认的2:Propagation.SUPPORTS3:Propagation.MANDATORY4:Propagation.REQUIR原创 2020-12-19 11:20:08 · 267 阅读 · 0 评论 -
Spring AOP底层源码分析
本文基于Spring5注解版进行分析分两大块分析,Spring创建AOP切面代理对象流程AOP切面方法通知执行流程Spring的AOP切面功能大家都用过,但是也会有一些人对AOP不是很理解,本文着重解析AOP的工作原理。AOP是什么?对我们的业务方法实现增强,对执行方法进行拦截。实际就是利用JDK/CGLIB实现动态代理。AOP应用场景,能帮我们干什么?控制层请求日志打印 ,保存。控制层权限控制。业务层分布式锁。Spring 事务。开始分析:要用Spring AO原创 2020-12-14 14:53:06 · 253 阅读 · 0 评论 -
Spring getBean, createBean, doCreateBean
原文地址:Spring 启动流程原文地址:Spring Bean创建流程Spring getBean从IOC容器中获取Bean,如果没有则创建Bean -> createBeanSpring createBean创建Bean实例 -> doCreateBean创建Bean的流程创建Bean的时候,会先记录当前创建的Bean,实例化Bean后,先在三级缓存中,保存信息,为了解决循环依赖问题。(A依赖B,B依赖A)实例化Bean之前,会先创建有@DependsOn注解的Be原创 2020-12-12 22:08:09 · 516 阅读 · 0 评论 -
Spring Bean创建流程图
原文地址:https://blog.csdn.net/liuqi199707/article/details/110732380原文地址:https://blog.csdn.net/liuqi199707/article/details/111052503简单流程图详细流程图原创 2020-12-12 21:58:03 · 632 阅读 · 0 评论 -
Spring底层源码解析(二)创建Bean finishBeanFactoryInitialization(beanFactory)
本文基于Spring5注解版进行分析继上一篇文章Spring 底层源码解析(一)扫包注册Bean继续分析Bean的创建过程。此方法将会创建所有的非懒加载的Bean先来看一张简单的Bean创建流程图,Spring创建Bean看着和后置处理器()息息相关啊BeanPostProcessorSpring Bean创建源码流程图对bean的创建描述得非常清晰,请认真观看,跟着流程图走一遍代码。走源码1.0.0:finishBeanFactoryInitialization()/** *原创 2020-12-12 19:30:35 · 572 阅读 · 0 评论 -
Spring底层源码解析(一)扫包注册Bean
本文基于Spring5注解版进行分析主要分析Spring扫包工作流程@ComponentScan(),Bean创建流程,Bean生命周期Maven依赖:<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId>原创 2020-12-06 23:36:50 · 735 阅读 · 5 评论 -
MyBatis 核心类分析
继上一篇文章MyBatis 底层源码解析,再次分析下MyBatis的核心类初始化,解析配置文件相关类:Configuration:核心中核心配置类,无论执行什么操作,都有他的存在。XMLConfigBuilder:解析mybatis-config.xml。XMLMapperBuilder:解析mapper.xml。XMLStatementBuilder:解析mapper.xml中的Sql语句。MapperAnnotationBuilder:解析Mapper接口的注解信息。MapperBuil原创 2020-11-22 22:26:12 · 534 阅读 · 2 评论 -
MyBatis底层源码解析 (详细)
MyBatis一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。MyBatis底层是怎么运行的呢?1:启动,加载配置文件new SqlSessionFactoryBuilder().build(reader),SqlS原创 2020-11-18 12:22:53 · 14944 阅读 · 25 评论 -
Java设计模式(建造者模式)通俗易懂
建造者模式对于有多个成员属性,且不是每个成员属性都需要的类进行实例化,如果用构造函数,或set方法赋值,代码就不通俗易懂了。例如有一个网络请求的类,有以下这些成员属性构成,但是发起一个网络请求,用不到这么多的参数,显然构建这个对象就有点复杂。使用建造者模式角色产品角色 (Request类)建造者角色 (Request.Builder类)import java.util.LinkedHashMap;import java.util.Map;public class Request原创 2020-11-02 13:05:38 · 327 阅读 · 0 评论 -
Java设计模式(原型设计模式)
原型设计模式(创建型模式)用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象,且无需知道如何创建的细节。适用于创建复杂的或者构建耗时的对象,通过原型拷贝效率高效。如图所示,浅拷贝案例,实现 Cloneable接口,重写Object类下的clone()方法完成克隆。创建对象花费2000多毫秒,克隆几乎没有花费时间,说明克隆不走构造函数。克隆的对象 hashCode 与 原来的对象不一样,说明产生了一个新的对象,并且把原有的属性值也赋值给克隆对象。(赋值实际是将引用地址赋值)原创 2020-11-01 22:36:49 · 279 阅读 · 0 评论 -
Java 抽象类与接口的区别
注意:本文基于 Java 1.8 编写;抽象类和接口都不能直接实例化,而是由子类去继承或实现,再由子类实例化;抽象类和接口都可以定义静态常量;抽象类的静态常量属性,可以定义访问权限;接口的静态常量属性,默认访问权限就是 public,而且不能定义其他访问权限;声明的成员属性默认就是由 public final static修饰的接口的汇编代码抽象类的抽象方法可以定义访问权限接口类的抽象方法默认访问权限就是 public abstract抽象类和接口类都可以定义好算法骨架(默认实现的方法原创 2020-10-29 14:46:13 · 346 阅读 · 0 评论 -
Java设计模式 (单例模式)
单例模式 (创建型模式)什么是单例模式为什么要使用单例模式单例模式八种写法1:饿汉式<线程安全>2:饿汉式<线程安全;静态代码快>3:懒汉式<线程不安全>4:懒汉式<线程安全;同步方法>5:懒汉式<线程不安全,同步代码快>6:懒汉式<线程安全,同步代码快,双重检查>7:静态内部类<线程安全>8:枚举<线程安全>什么是单例模式在JVM运行环境中,一个类只存在一个实例对象,并且这个类只提供一个获取到该实例的方法原创 2020-10-29 13:09:35 · 435 阅读 · 4 评论 -
Java设计模式 七大原则
七大原则单一职责原则接口隔离原则(Interface Segregation Principle)依赖倒转(倒置)原则(Interface Segregation Principle)里氏替换原则开闭原则迪米特法则合成复用原则单一职责原则一个类应当只负责一项职责,在业务逻辑简单的情况下 也可以一个方法负责一项职责优点降低类的复杂度;提高类的可读性,可维护性;降低变更类引起的风险注意事项在业务逻辑非常简单的情况下,类会增多;所以可以在代码级违反单一职责原则。只有类中方法数量足够少,原创 2020-10-25 15:49:08 · 1182 阅读 · 3 评论 -
Java 类加载过程
Java 类加载 双亲委派原则什么是双亲委派原则简单说下:比如有 爷爷,父亲,孙子 三个角色。现在孙子要做一件事,但他必需要先告诉他的父亲,然后他的父亲再告诉爷爷。爷爷收到事件后,就判断下自己能不能处理,如果不能处理,就交给他的儿子,也就是孙子的父亲去处理。父亲收到后,也判断下自己能不能处理,如果不能处理,就又交回给儿子自己的处理。看图现在断点调试下流程:在 new 一个对象的时候,下一个断点在 ClassLoader 类的 loadClass(String name, boolean r原创 2020-10-13 19:33:12 · 503 阅读 · 2 评论 -
Java设计模式 模板方法模式
什么是模板方法模板方法模式是一个类的行为模式。定义一个操作流程的模板方法,然后声明部分抽象方法,迫使子类实现 并完善其业务逻辑,不同的子类有不同的实现 从而子类完善的业务逻辑也不一样。模板方法模式的结构AbstractClass: 抽象模板(Abstract Template)角色有如下责任定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应原创 2020-10-12 17:55:35 · 351 阅读 · 0 评论 -
Java设计模式 策略模式
什么是策略模式一个行为多种实现。基于一种行为,委派给不同的对象去管理。可以解决多重if判断和switch。比如第三方支付 支付宝支付,微信支付,苹果支付;如下图所示不使用策略模式的代码如下如果现在再来一个小米钱包支付,就需要再原基础代码上进行改动。改动如下这样就会有个缺点,每次新增一个支付功能,就需要在基础代码上做改动,很显然的违背的开闭原则使用策略模式对以上代码进行改进声明一个支付的抽象类,定义一个支付唯一标识,一个支付方法(由字类实现),和一个构造函数。p原创 2020-10-11 15:22:27 · 579 阅读 · 0 评论 -
Java网络编程 浅谈BIO
Java BIO(同步阻塞 I/O),服务器实现模式为一个连接一个线程。即客户端发起请求时,服务器需要启动一个线程执行。Java NIO(同步非阻塞 I/O), 服务器实现模式为一个线程可以处理多个请求。即客户端发起请求时,服务器接收请求会注册到多路复用器上,多路复用器轮询到连接就处理。先看下 BIO是如何工作的:一个很简单的Demo 服务接每次收到请求,开启一个线程。代码演示ServerSocket serverSocket = new ServerSocket(8080);原创 2020-10-10 23:44:43 · 361 阅读 · 0 评论 -
基于Netty做一个简单的群聊服务端
学习目标:加粗样式提示:这里可以添加学习目标例如:一周掌握 Java 入门知识学习内容:提示:这里可以添加要学的内容例如:1、 搭建 Java 开发环境2、 掌握 Java 基本语法3、 掌握条件语句4、 掌握循环语句学习时间:提示:这里可以添加计划学习的时间例如:1、 周一至周五晚上 7 点—晚上9点2、 周六上午 9 点-上午 11 点3、 周日下午 3 点-下午 6 点学习产出:提示:这里统计学习计划的总量例如:1、 技术笔记 2 遍2、CSDN 技术博原创 2020-10-06 23:02:50 · 353 阅读 · 0 评论