
java基础
文章平均质量分 66
安安静静写bug
记录笔记
展开
-
传统tomcat启动服务与springboot启动内置tomcat服务的区别
spring整合springmvcspring整合springmvc中web.xml配置如下,tomcat在启动过程中会加载web.xml中的内容,ContextLoaderListener实现了tomcat里面的ServletContextListener接口,所以在tomcat容器启动过程通过ContextLoaderListener来进行spring容器的初始化操作,并将classpath:spring/applicationContext-*.xml指定下的spring配置文件加载,该配置文件原创 2021-05-04 19:41:47 · 2600 阅读 · 13 评论 -
阿里云centenos7.6版本安装JDK\mysql\redis\nginx\RabbitMQ合集
以下安装均使用的是阿里云centenos7.6版本1、安装JDK1、查看可安装的jdk版本yum -y list Java*2、安装yum install -y java-1.8.0-openjdk-devel.x86_643、查看版本java -version4、切换到安装目录cd /usr/lib/jvmJAVA_HOME指向一个含有java可执行程序的目录(一般是在 bin/java中,此目录为/bin/java的上级目录),用cd 命令进入到 jvm下唯一的一个目录中 j原创 2021-03-18 10:49:10 · 621 阅读 · 0 评论 -
SpringBoot环境下junit单元测试速度优化
1、提高单元测试效率背景:在项目提测前,自己需要对代码逻辑进行验证,所以单元测试必不可少。但是现在的java项目几乎都是基于SpringBoot系列开发的,所以在进行单元测试时,执行一个测试类就要启动springboot项目,加载上下文数据,每次执行一次测试都要再重新加载上下文环境,这样就会很麻烦,浪费时间;在一次项目中,我们使用自己的技术框架进行开发,每次单元测试时都要初始化很多数据(例如根据数据模型建立表,加载依赖其它模块的类),这样导致每一次单元测试时都会花3-5分钟时间(MacOs 四核I原创 2021-03-14 10:36:40 · 9020 阅读 · 10 评论 -
mysql之limit查询优化
1、相关说明准备uc_user表,给字段created_at建立索引2、开始实验分别执行下面两条sqlselect * from uc_user ORDER BY created_at LIMIT 1000,10; // 代表取出1010条数据,然后只要最后10条select * from uc_user ORDER BY created_at LIMIT 100000,10; // 代表取出100010条数据,然后只要最后10条结果如下图:从上图看出查询时间差别很大,我给created_at原创 2020-12-20 19:33:49 · 789 阅读 · 0 评论 -
重写RequestMapping
1、为什么要自定义在项目开发中,有一次一个需求涉及到修改几个方法,需要在这几个方法中添加自己的业务逻辑,这几个方法是标有@RequestMapping注解的方法,而且这几个方法在封装好的底层jar包中,那么如何修改呢?思路:1、首先想到的是通过重新在controller层自定义一个url,然后对底层的对应方法进行一个重写操作,这样是可以解决问题,但是如果这样修改,前端接入的url也要配合修改,这样就增加了一定工作量,当后续修改更多这样的底层url后,对接也会变得复杂,所以该方案可行,但是不够优雅;2、原创 2020-12-06 17:52:47 · 1804 阅读 · 3 评论 -
自定义ORM框架
什么是ORMORM:Object-Relation-Mapping,也就是对象关系映射,是一种程序设计思想,mybatis就是ORM的一种实现方式,简单来说就是将数据库中查询出的数据映射到对应的实体中。自定义ORM框架在jdbc编程中,我们获取到resultSet集后会遍历结果集中的数据,然后通过resultSet.getString(列数或者参数名称),resultSet.getLong(…)获取值,这样很不方便,因为每次获取到结果都需要自己遍历获取值,程序开发的时间和成本会增加很多,所以有没有一原创 2020-11-22 17:41:04 · 372 阅读 · 0 评论 -
手写springMVC(附源码)
1、springMVC简单介绍在手写springMVC前,需要大概了解下springMVC,springMVC其实是spring的一个子容器,可以专门用来处理web层的请求,而MVC则是model(模型)、view(视图)、controller(控制器)的简称,springMVC主要由以下几个部分组成:1、前端控制器 DispatcherServlet2、处理器映射 HandlerMapping3、视图解析器进行解析简单通过下图理解下,其实最重要的就是前端控制器,它负责是请求入口与出口的一道闸门,原创 2020-11-07 20:30:27 · 358 阅读 · 0 评论 -
servlet入门简单解析
servlet是什么servlet是一个运行在java服务端的轻量级的程序。servlet也是一个接口,定义了标准的服务,比如我们常用的服务器Tomcat就是实现了servlet的标准接口,这样Tomcat实现了这个标准就能够接收到request请求并响应,当然接收和响应一个请求其实就是进行socket的接收消息和响应消息。servlet生命周期servlet的生命周期其实围绕着servlet中定义的接口方法而呈现的,如下:1、servlet的初始化。这里会调用servlet接口中的init原创 2020-10-31 20:27:31 · 241 阅读 · 1 评论 -
项目中双重加锁与redis的配合使用
说明,在工作中遇到的一个类似于单例模式双重加锁与redis结合的应用,因此记录下来,但是最开始代码有些问题,之后我做了些改进1、synchronized加锁场景,根据商品id(itemId)去查找商品,先从缓存中获取,缓存中获取不到再从数据库中获取。最开始的伪代码如下,但存在一些问题:String key = String.format("item.detail.%s", itemId); // 从redis中获取数据-这里可能有多个线程同时从redis中获取数据 .原创 2020-07-19 16:14:26 · 608 阅读 · 2 评论 -
elasticsearch结合canal实战-问题搜索系统
你是否有这样的困惑?刚进一家公司后遇到各种bug,而这些bug很多和公司所使用的技术栈有关,有些问题你排查起来很难定位到具体错误原因,解决起来会很废时间,当然你可以咨询同事,但是他们也不一定有空,也可能不知道,于是在接触es与canal后我想写这样的一个简单的问题搜索系统,帮助你快速搜索到类似到问题,而不是在百度里面去大海捞针。系统还不是很完善,还有很多不足到地方,比如前端页面显示数据到问题,本人主要是后台开发,前端这部分还没有写,如果有感兴趣的小伙伴,欢迎加入,GitHub:https://git.原创 2020-07-12 18:04:11 · 781 阅读 · 0 评论 -
java读取zip文件内容读取不到数据问题记录
·# 需求:需要将zip文件里面的文件进行拷贝,将拷贝后的文件上传到对应的服务器遇到的问题,在读取zip文件里面的文件时,发现读取到的文件大小和实际文件大小不一致相关代码如下:public class ZipFileDemp { @SneakyThrows public static void main(String[] args) { File fileTemp = new File("/Users/zhuifengzheng/Downloads/fi原创 2020-06-27 18:17:44 · 1724 阅读 · 0 评论 -
java流stream的简单封装
stream的二次封装在工作中,经常有这样的需求:将一个集合转换成map、将一个集合过滤筛选等操作等。这些通过java8的流编程很容易实现,但是写多了就会发现这样一长串写下来很不爽,于是我对它进行了简单封装,比如我想要的结果是将一个list转换成map,map的key是list对象中的主键,那么我可以构造一个方法,传入list和map中key与value的函数,返回想要的结果,感觉这样更加清晰,就类使用黑盒,代码如下:public class DecorativeStreamUtil {原创 2020-06-06 20:17:15 · 1329 阅读 · 0 评论 -
Netty之bind源码分析
本文将对Netty服务端中的bind方法进行分析,该方法是Netty核心的实现,通过本文你将了解Netty是怎样接收请求和处理请求的。1.bind(…)方法之前的文章已经介绍过ServerBootstrap 和相关的方法,这里主要分析的是bind()方法ServerBootstrap bootstrap = new ServerBootstrap();# 绑定端口bootstrap.bind(9000).sync();这里开始分析主流程,bind()方法里面最后会调用doBind().原创 2020-05-30 20:37:14 · 458 阅读 · 0 评论 -
Netty之ServerBootstrap源码分析
本文是对Netty的服务端ServerBootstrap类的简单分析,以此来学习Netty源码的设计思想,通过本文你将了解Netty是如何创建启动类的,如有错误请指出,谢谢。ServerBootstrap启动1.构造启动类# 创建启动类ServerBootstrap bootstrap = new ServerBootstrap();2.注册基本信息# 1.group:将创建的bossGroup与workerGroup线程组添加到启动类中# 2.channel:设置创建消息事件传输的管道.原创 2020-05-10 21:14:57 · 331 阅读 · 0 评论 -
Netty之NioEventLoopGroup源码分析
本文是对Netty中NioEventLoopGroup的简单分析,该类是连接接入的入口,它负责新连接的接入与连接事件的处理,接下来我会从使用它的角度去分析该类的作用,通过本文你将了解到Netty是如何创建线程去处理连接的,如果文章中有错误希望能够指出,谢谢。NioEventLoopGroup之大管家我们在编写Netty服务的时候,首先会创建bossGroup与workerGroup,如下...原创 2020-04-19 14:53:06 · 444 阅读 · 0 评论 -
Netty深入学习总览
本文是对学到的netty知识的简单总结,在之后的文章中会逐步分析netty源码,如果文中存在错误希望能够指出,谢谢。Netty是什么学习netty之前,首先我们来了解下什么是netty。这里简单的来说就是基于NIO实现的高性能异步的通信框架。因为Netty是基于NIO的,所以为了更加清楚Netty里面的结构,我们回顾下NIO的线程模型,如下图:了解了NIO模型和什么是netty之后,...原创 2020-04-12 18:08:00 · 375 阅读 · 0 评论 -
Socket网络编程与BIO、NIO、AIO分析
本文会对比BIO、NIO、AIO的区别,会从计算机运行的角度去分析这些IO,通过此方式来加强自己对IO的理解,也希望和大家一起交流学习。宏观了解IO计算机由硬件和软件组成,硬件是软件运行的基础。接下来我会简单分析一下一个程序在计算机中是怎样运行的。这里以window系统为例,当我们双击一个应用,比如微信,之后电脑作了下面的操作。1.首先双击微信时候,操作系统会首先读取程序的标识信息【包...原创 2020-03-29 14:57:20 · 683 阅读 · 0 评论 -
宏观了解synchronized
本文主要是我自己对synchronized关键字的认识,从宏观角度了解它的作用。脑图如下脑图中数据synchronized(重量级锁) 1 出现的原因 1.1 保证多线程的安全性 2 工作原理 2.1 monitorEnter(加锁) 2.2 monitorExit(解锁) 2.3 通过操作系统底层的互斥锁加锁(mutex_lock) 3 锁的是对象(...原创 2020-03-20 19:15:28 · 128 阅读 · 0 评论 -
volatile关键字整理
本文是对volatile关键字整体的宏观认识,是总结性笔记,不会具体到代码和具体分析,只是从我的角度去看代这个关键字。1.volatile思维图:2.volatile文字版总结1.现代计算机工作原理 1.1 CPU从内存读取指令 1.2 CPU控制器解释指令 1.3 CPU运算指令后最后值写回内存 1.4 CPU组成 1.4.1 控制器 1.4.2 存储器 1.4....原创 2020-03-08 15:16:36 · 147 阅读 · 0 评论 -
ScheduledThreadPoolExecutor(定时任务线程池)简单理解
本文主要介绍了可定时线程池的核心原理,从宏观角度大概分析了线程池工作方式,如有不足,请指出,谢谢。1.什么是线程池线程池顾名思义是一个线程缓存的‘池子’。线程是稀缺资源,线程如果创建的太多,会消耗系统的资源,还会降低系统的稳定性,所以java中通过线程池来统一管理分配线程这个稀缺的资源,达到资源重复利用。2.线程池的出现在web系统中,服务器需要接受大量的并发请求,一个请求就会对应一个...原创 2020-02-24 11:12:23 · 3993 阅读 · 0 评论 -
线程池(ThreadPoolExecutor)分析
说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。1.什么是线程池线程池顾名思义是一个线程缓存的‘池子’。线程是稀缺资源,线程如果创建的太多,会消耗系统的资源,还会降低系统的稳定性,所以java中通过线程池来统一管理分配线程这个稀缺的资源,达到资源重复利用。2.线程池的出现在web系统中...原创 2020-02-16 19:24:31 · 467 阅读 · 0 评论 -
ReentrantLock实现原理分析
本文只对ReentrantLock中获取锁和释放锁的方法进行分析,其它方法不做分析。1. 加锁 lock方法分析ReentrantLock实现了Lock接口,Lock中定义了获取锁和释放锁的常用方法,ReentrantLock这个类实现了Lock中的方法,ReentrantLock中的锁分为公平锁和非公平锁,公平锁可以保障线程排队的顺序,非公平锁可以插队,那ReentrantLock类中...原创 2020-02-09 18:30:27 · 226 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)中获取与释放锁分析
说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。AQS(AbstractQueuedSynchronizer)核心分析首先看一下类图:AbstractOwnableSynchronizer是个抽象类,以独占模式设置当前持有的线程。AbstractQueuedSynchronizer...原创 2020-01-25 21:29:21 · 360 阅读 · 0 评论 -
synchronized底层实现原理分析
说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。1.线程安全问题的出现原因 之前说过,线程可以看作是轻量级进程,进程的上下文切换代价比较高,线程的上下文切换比较低,所以线程的出现提高了程序切换运行的时间。但是多线程的出现也引发了一些安全问题,比如:有可能会出现多个线程同时访问同一个共享、...原创 2020-01-12 16:39:36 · 270 阅读 · 0 评论 -
JAVA线程实现与状态简介
说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。1.java多线程 首先我们来看一下什么是进程。进程其实可以看作一个可运行的程序,那么多个程序同时运行就是多进程(是操作系统分配资源的基本单位),一个进程可以包含多个线程(CPU调度的基本单位),比如微信就是一个程序(进程),微信里面可...原创 2020-01-12 16:35:38 · 209 阅读 · 0 评论 -
JAVA泛型分析
1.泛型简单分析声明:本文是我对泛型的一些理解,主要的是分析,而不是具体应用,所以讲的并不是面面俱到,具体的实现和用法可以参考具体的API文档。首先我们看一下下面这段代码var list = new Array();list.push(1);list.push("test")for(var m in list){ alert(list[m]+1);}上面的Jav...原创 2020-01-05 12:20:13 · 1167 阅读 · 2 评论 -
java内部类简单分析
说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。内部类是什么内部类就是在类中的类,当然也可以写在方法中,称为局部内部类。那为什么需要内部类呢?内部类可以调用外部类的私有属性和私有方法。内部类使得开发更加可读,代码维护有针对性。内部类可以对同一包中的其他类隐藏起来。内部类可以解...原创 2020-01-05 12:15:17 · 639 阅读 · 8 评论 -
JAVA集合分析
说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。1.集合Collection分析在开始说集合之前我们先看一下什么是变量,变量是由变量类型+变量名称组成,变量是用来保存信息的载体。那再看看集合,集合是由集合存储的类型+集合名称组成,简单来说就是存储一类数据的容器,在java中集合的父类是Co...原创 2019-12-29 23:22:08 · 756 阅读 · 3 评论 -
java基础-String类Intern()方法分析
说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。1.==分析*Java中的对象默认都是Object类的子类,在Object中,equals方法与==都是比较地址(基本类型除外),下面看一段代码public class Hello { public static void main...原创 2019-12-22 11:29:32 · 813 阅读 · 0 评论 -
JAVA三大特性(封装、继承、与多态)分析
说明:本文是我对自己之前学到知识的总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习。Java面向对象java是面向对象的一门语言,它符合人的思考方式,在java中万物皆对象。一般来说,一个程序的开发包括OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)三个方面。OOA主要分析一个对象的属性,方法等,OOD主要根...原创 2019-12-22 11:29:03 · 644 阅读 · 0 评论 -
JVM内存模型与对象垃圾回收分析
1.JVMjvm(java虚拟机)是java程序运行的地方,它存放了java对象的信息。java程序能够一次编译到处运行就是因为有jvm的存在,它是与操作系统交互的桥梁。之前的C语言在编写程序分配内存时候,如果不及时释放内存,就很容易造成内存泄漏,而jvm有自己的一套内存回收机制,所以java程序员有更多的精力去编写程序,而不是去担心内存泄漏的问题。jvm结构图如下:这里简单说明:堆...原创 2019-12-07 14:06:34 · 425 阅读 · 0 评论 -
java对象生命周期分析
java对象生命周期分析说明:本文是我对自己之前学到知识的总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习。通过字节码分析程序中对象是怎样加载运行的1.代码public class People{ public int age = 18; public People(){ this.age = ...原创 2019-12-07 13:57:17 · 256 阅读 · 0 评论 -
java基础--HelloWorld是怎样运行的
1.Hello World 字节码分析说明:本文是我对自己之前学到知识的总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。本文目标:通过输出hello world,分析java程序在计算机中运行的生命周期,了解程序怎样执行。2.程序代码如下:public class Hello { public static voi...原创 2019-12-01 10:22:04 · 2350 阅读 · 3 评论