- 博客(124)
- 收藏
- 关注
原创 自定义注解和自定义注解处理器来扫描所有带有某个特定注解的Controller层
通过以上配置,当Spring Boot应用程序启动时,CustomAnnotationProcessor 将会在初始化Bean之前扫描所有的Controller类,并找到标记了 @CustomAnnotation 注解的类进行处理。您可以根据实际需求,在 postProcessBeforeInitialization 方法中对这些Controller类做进一步的操作。
2023-08-19 22:52:31
520
原创 MySQL大表处理方式、快速复制表结构和数据的方式
文章目录mysql 如何给大表添加字段mysql千万级数据大表该如何优化?MySQL数据库如何优化性能硬优化(1)CPU、内存、磁盘(2)优化数据库的配置参数(3)数据库集群,分库分表,实现读写分离(4)建立redis缓存集群软优化(1)优化查询语句,尽量避免全表查询(2)优化子查询,尽量使用join来代替子查询(3)使用索引(4)适当增加冗余字段数据库设计和表设计要考虑性能MyISAM和InnoDB引擎的区别B树索引和B+树索引的区别mysql 如何给大表添加字段(1)复制大表的表结构,创建一个表结构
2021-09-05 00:21:21
3392
1
默认字符集编码:Charset.defaultCharset()
文章目录Charset的defaultCharset方法实现如何将byte数组通过指定编码方式转换为字符串转换流InputStreamReader和OutStreamWriter使用了Charset.defaultCharset()方法经典参考文章Charset.defaultCharset()和file.encoding的关系一切存储在硬盘上的数据都是二进制数据,而IO流从硬盘读取到内存中的数据都存储在byte数组中,byte字节数组需要按照对应的编码规则才能解码为正确的字符串、图片等对象。Ch
2021-07-03 18:52:02
4846
原创 MVCC(Multi-Version Concurrency Control)多版本并发控制
MVCC(Multi-Version Concurrency Control)多版本并发控制
2021-04-20 09:46:59
410
原创 JVM常量池
文章目录什么是常量常量池静态常量池运行时常量池javap命令反编译后的文件什么是常量final修饰的变量就是常量,值一旦给定就无法改变final修饰的变量分为三种:静态变量、实例变量和局部变量常量池常量池分为两种:静态常量池和运行时常量池常量池中主要存放两大类常量:字面量和符号引用量(1)字面量则属于Java语言层面常量的概念,包括字符串常量、基本数据类型、final修饰的成员变量值(2)符号引用量则属于编译原理方面的概念,包括了如下三种类型的常量:类和接口的完全限定名、字段名称和描述
2021-04-11 14:20:06
179
原创 java中数组、字符串、list的最大长度
数组的最大长度数组的length属性是int类型,占4个字节,最大值为Integer.MAX_VALUE= 231-1【21亿多】int[] a = {1, 2};int length = a.length;字符串String的最大长度String、StringBuilder、StringBuffer底层都是基于字符数组char[ ]的,该数组的最大长度也为Integer.MAX_VALUE,所以一个字符串最大21亿多个字符,即占232-2个字节【(231-1)*2】,即差2个字节达到4GB。
2021-04-10 20:27:49
4340
原创 MySQL的表没有设置主键带来的问题
文章目录mysql定义了主键,主键达到最大值mysql没有定义主键,主键达到最大值缺少主键存在问题mysql定义了主键,主键达到最大值(2) 如果申明了主键,当主键达到最大值,再插入则主键不会再增长,而是报主键重复错误。MySQL主键当达到最大值(如果为int类型,最大值为21亿多),此时再插入数据,会提示主键重复错误。mysql没有定义主键,主键达到最大值如果没有定义主键,InnoDB会自动添加一个不可见的、长度为6字节的row_id列,即不能被任何查询访问,也不能被内部使用。该row_id由
2021-04-04 17:06:25
8370
原创 MySQL锁机制
文章目录锁锁分类读锁(共享锁)行锁锁锁是计算机协调多个线程访问同一共享资源的机制,主要用于解决多线程访问同一共享资源的并发安全问题。锁分类(1)从性能分为:乐观锁和悲观锁MySQL中采用版本号控制,JVM中使用CAS(2)从数据库操作类型分为:读锁、写锁 【读锁和写锁都属于悲观锁】读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会注意:(1)读锁、写锁都属于行级锁,即事务1 对商品A 获取写锁,和事务2对商品B 获取写锁互相不会阻塞的。(2)当我们的SQL全表扫描的时候,行级
2021-04-03 12:23:11
1692
8
原创 java对象模型
文章目录oop-klass模型oop-klass模型HotSpot虚拟机使用的opp-klass模型来描述一个JAVA类,分别使用oop保存类的实例数据,klass保存类的元数据和虚方法表。JVM内部是使用C/C++实现的,每一个java类最后都会被JVM转换成内部的C++类表示,分别使用C++的oop类保存java类的实例数据,C++的klass类保存java类的元数据和虚方法表。oop模型分为多种类型,每种oop类型都有自己特定的结构,如常量池对应的opp对象就是constantPoolOop,
2021-02-08 13:23:30
270
2
原创 Java多态(动态绑定)的底层原理:虚函数表
文章目录C++的虚函数和纯函数的区别虚函数表虚函数表的构造过程虚函数的调用过程java多态的实现是通过itable(interface method table:接口方法表), vtable(virtual method table:虚方法表)来实现方法的准确跳转。接口方法表和虚方法表的原理和C++的虚函数表类似。C++的虚函数和纯函数的区别纯函数: 在基类中只进行声明,不进行具体实现,而在子类进行具体实现,类似于java接口中的方法。注意: C++允许多重继承,是通过抽象类来实现java中接口作
2021-02-07 23:48:38
2983
2
原创 JVM和字节码的关系
文章目录程序运行的两种方式:静态编译和动态解释Java严格说来是“半解释半编译”型的语言通过编译原理理解java虚拟机编译和解释机制字节码文件和JVM的关系程序运行的两种方式:静态编译和动态解释静态编译的程序在执行前全部被翻译为机器码动态解释执行的则是一句一句边运行边翻译Java严格说来是“半解释半编译”型的语言Java代码首先由javac编译器编译成字节码(ByteCode)。字节码文件中JVM指令(也称字节码指令)是JVM唯一能够识别的指令,JVM执行JVM指令时,通过JVM解释器逐条读
2021-01-31 12:32:17
1961
5
原创 final关键字
文章目录final的作用final不能修饰抽象类静态方法没有必要修饰静态方法匿名内部类访问方法中的局部变量为什么必须被final修饰分析final修饰的变量如何传入匿名内部类为啥需要final修饰局部变量final的作用静态方法可以修饰类、静态成员变量、普通成员变量、普通方法(1)final修饰类的作用:阻止当前类被继承(2)final修饰的方法的作用:阻止子类继承和重写【注意:子类可以重载该方法】(3)final修饰的成员变量初始化后便不可用修改,基本数据类型不能修改值,引用数据类型实际是引用不
2021-01-31 01:24:05
245
原创 Linux通过rm命令删除jar包日志文件后磁盘空间没有释放的原因和解决办法
文章目录现象原因解决办法需要关闭进程才能释放空间不需要关闭使用日志的进程即可释放空间的办法现象服务器磁盘空间满了,删除jar包运行生成的日志文件后,通过df -h命令查看磁盘空间,发现根本没有释放磁盘空间。原因一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以在出现删除
2020-12-19 00:39:03
1761
1
原创 用户态和内核态的简单理解
文章目录linux基础系统调用和库函数的区别什么是用户态和内核态用户态和内核态的相互转换linux基础linux的kernel内核外是系统调用,系统调用外是shell、库函数系统调用和库函数的区别内核:屏蔽了调用各硬件资源的细节系统调用:内核提供给用户调用的接口,但系统调用的可移植性差移植性差的原因:windows、linux内核的系统调用是不同的,比如:同一个功能提供给用户的函数名、参数都不相同,会出现从一个系统移植到另一个系统无法正常运行。库函数:为了解决系统调用移植新差的问题,同时封
2020-12-12 15:12:18
5911
转载 Redis中的String二进制安全机制
文章目录二进制安全二进制安全的例子Redis的二进制安全常见问题参考文章:深度分析Redis的二进制安全二进制安全二进制安全是与操作字符串的方法的相关术语,该方法的参数可以包含任何字符,方法会公平的对待数据流的每个字符,不特殊处理其中某一个字符,包括特殊字符。【特殊情况:该方法就是用于处理特定字符】二进制安全的例子C语言中字符串是以特殊字符“\0”来作为字符串的结束标识。对于字符串str="0123456789\0123456789”来说,在C语言里面str的长度就是10(strlen(str)=
2020-10-20 15:07:12
1382
原创 JVM基础:运行时数据区
文章目录JVM后台系统线程(仅作了了解)程序计数器虚拟机栈栈帧栈帧的结构局部变量表变量槽(slot)常见问题栈内存溢出的情况本地方法栈堆方法区元空间内存溢出方法区和堆是线程共享的:堆外内存(元空间、代码缓存)程序计数器是线程私有的:每个线程都有自己的程序计数器、虚拟机栈、本地方法栈Hostsport JVM中,每个线程都与操作系统的本地系统直接映射:(1)当一个java线程准备好执行以后,此时操作系统的本地线程也同时创建,一旦调用本地线程初始化成功,操作系统就会调用java线程的run方法。(
2020-10-19 23:16:34
527
原创 JVM基础:类的加载
文章目录类加载的完整过程类的加载器分类(1) 启动类加载器Bootstrap ClassLoader(2)扩展类加载器Extension ClassLoader(3)应用程序类加载器(系统类加载器 AppCLassLoader)(4)自定义类加载器(目前仅作了解,待后续学习)双亲委派机制验证双亲委派机制使用双亲委派机制的原因判断两个Class类型的对象是否是同一个对象的条件类加载器常用API常用的三种获取应用程序类加载器的方式获取当前类的类加载器、获取父类加器、获取各类加载器可以加载的jar包路径Ca
2020-10-17 21:04:09
376
6
原创 原因分析(java):CPU内存占用过高 || 程序长时间运行也没有结果
文章目录基础知识准备查看CPU信息top指令top界面的实用操作找出线程占用cpu的情况JVM之Jstack使用实际运用找出占用内存过高进程的线程步骤基础知识准备查看CPU信息 cat /proc/cpuinfo cat /proc/cpuinfo|grep 'cpu cores' # cpu的物理核数 cat /proc/cpuinfo|grep 'processor' # 查看逻辑核标识,一般从0开始top指令load average: 0.03, 0.06, 0.06 负载均
2020-10-11 16:58:20
927
原创 深拷贝和浅拷贝的区别
文章目录浅拷贝和深拷贝的定义常见的浅拷贝方式常见的深拷贝方式浅拷贝和深拷贝的定义浅拷贝:只是将代表源对象的地址拷贝给了另外一个变量,该变量和原来变量都指向同一个地址,当源对象的发生变化时,拷贝对象和源对象都会发生变化深拷贝:创建了新空间来存储源对象的值,源对象和拷贝对象存放的地址不一样,两个对象任意一个发生变化都不会影响另外一个。常见的浅拷贝方式(1)一个引用类型变量直接赋值给另一个变量(2)BeaUtil.copyProperties()常见的深拷贝方式(1)通过构造器或new的方式
2020-10-08 14:15:05
218
原创 JAVA内部类简单使用
文章目录成员内部类局部内部类匿名内部类实际就是内部类简化写法,只要存在一个类或接口就可以使用类中定义接口内部类:一个类的内部定义的类外部类:拥有内部类的类成员内部类又分为静态成员内部内和非静态成员内部类局部内部类可以位于方法内、块内、构造器内成员内部类:分为成员内部类和局部内部类成员内部类(1) 成员内部类可以访问外部类的所有内容,包括静态和非静态的都可以访问(2)静态成员内部类只能访问外部类的静态成员、静态方法,因为静态内部类是不依赖实例对象的,即便实例对象不存在也能运行,因此静态的只能访
2020-10-08 13:16:33
158
原创 JDK1.8 接口新特性:default方法和static方法
文章目录为什么接口中药增加默认方法和静态方法默认方法:被public default修饰的默认方法静态方法:被public static修饰的静态方法接口易错问题接口和抽象类的区别在JDK1.8之前,接口中只有两部分内容:(1)常量:固定修饰符public static final(2)抽象方法:固定修饰符public abstract在JDK1.8之后,接口新增非抽象方法为什么接口中药增加默认方法和静态方法如果接口中只能定义抽象方法,当修改接口时,该接口的所有实现类都会受到影响,为了减小这种影
2020-10-08 01:22:00
879
原创 ZooKeeper常用命令
文章目录连接和断开节点节点控制监听器ACL 访问权限控制列表连接和断开节点查看ZooKeeper的状态和角色:ZooKeeper安装目录/bin/zkServer.sh status通过ZooKeeper客户端:ZooKeeper安装目录/bin/zkCli.sh -server ip地址:port客户端连接成功后,输出ZooKeeper支持的所有命令:help客户端连接成功后,断开连接:quit节点控制查看指定路径下包含的节点:# 查看/目录下包含的节点ls /# 查看 /t
2020-10-06 19:17:35
1293
原创 MySQL中varchar(10)、varchar(100)和char的区别
存储同样长度的字符,varchar比char要多占用一个字节的空间,以存储字符串结束符二者操作内存的方式不同:对于varchar数据类型来说,硬盘上的存储空间虽然都是根据字符串的实际长度来存储空间的,但在内存中是根据varchar类型定义的长度来分配占用的内存空间的,而不是根据字符串的实际长度来分配的。显然,这对于排序和临时表会较大的性能影响。char占用磁盘的存储空间,是连续分配的varchar存储的数据是可变的,修改前后数据长度不一致,会出现磁盘碎片问题,碎片问题可以通过数据库的导入导出来实现存.
2020-10-05 19:23:25
610
原创 责任链模式的两个简单demo
责任链模式的核心是:过滤器链过滤字符当不满足条件时,则停止过滤手写HttpServletFilter需求:请求时按顺序先后进过FirstFilter,SecondFilter ,响应时再按顺序先后经过SecondFilter、FirstFilter,请求经过任何一个过滤器中如果不满足条件,则返回响应对象,此响应对象也会进过已经进过的过滤器/** * @author LiuWei * @date 2020/10/5 * @description */public class mainDem
2020-10-05 18:38:03
361
1
原创 动态代理模式和动态代理失效原因简介
Spring有两种动态代理实现方式java动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。cglib动态代理:利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理JDK动态代理和CGLIB字节码生成的区别:(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法【】因为是继承,所以该类或方法最好不要声明成final如果目
2020-10-04 20:43:40
3677
原创 MyBatis缓存机制
文章目录MyBatis缓存机制缓存查询顺序一级缓存和二级缓存的作用域一级缓存一级缓存失效的四种情况二级缓存SpringBoot启用二级缓存SpringBoot禁用二级缓存通过useCache属性指定Mapper接口中的方法禁用二级缓存多个Mapper接口共用一个二级缓存二级缓存的使用原则使用mybatis二级缓存的缺陷:(一般情况下不使用mybatis的二级缓存,使用redis等替代)MyBatis缓存机制MyBatis定义了两级缓存:一级缓存、二级缓存一级缓存:同一个SqlSession对象(与数据
2020-10-03 19:24:45
433
2
原创 Junit单元测试时,@Transactional注解引起的事务回滚问题
Junit单元测试时,在测试方法中打事务注解@Transactional,默认会按照@Rollback(true)来进行处理,即使在没加注解@Rollback,也会对事务回滚@Test@Transactional@Rollback(value = false)public void test01(){}Junit单元测试时,测试方法上加注解@Transactional,事务不回滚的解决办法:方法1:测试方法上在注解@Transactional的基础上,加注解@Rollback(value
2020-10-03 12:33:50
2657
原创 Elasticsearch中analyzer和search_analyzer的区别
如果想要在创建索引和查询时分别使用不同的分词器,ElasticSearch也是支持的。在创建索引,指定analyzer,ES在创建时会先检查是否设置了analyzer字段,如果没定义就用ES预设的在查询时,指定search_analyzer,ES查询时会先检查是否设置了search_analyzer字段,如果没有设置,还会去检查创建索引时是否指定了analyzer,还是没有还设置才会去使用ES预设的ES分析器主要有两种情况会被使用:插入文档时,将text类型的字段做分词然后插入倒排索引
2020-09-20 11:45:18
9641
1
原创 mysql常用语法
文章目录重新初始化表给已有表添加新增自增长主键id字符串转数字convert和cast的区别常用的信息函数系统变量自定义变量设置数据库系统参数有两种方式解决MySQL8.0时区的问题设置Mysql服务器端字符集事务隔离级别Delimiter的作用存储过程函数循环IF语句&& ||行转列 【一般用if函数和case when】列转行【一般用union】判断重复数据用:GroupBy 和Having 搭配使用 ----------- ---重复数据的删除重新初始化表TRUNCATE TA
2020-09-13 23:10:42
367
原创 ElasticSearch的超时搜索timout机制
ElasticSearch会在timeout时间范围内,将搜索到的部分数据(也可能全部都搜索到),直接返回给client,而不是等所有都数据搜索到再返回GET /test/_search{ "query": { "match_all": { } }, "timeout": "1s"}返回结果中是否超时会根据阈值进行判断...
2020-09-12 20:05:35
2889
原创 ElastichSearch的高亮查询
ElastichSearch通过配置highlight字段可以实现高亮查询,通过fields指定需要搞定的字段,返回结果中需要高亮的词默认使用html标签em包裹,em标签主要起强调作用,我们可以自定义用什么样的css标签来进行包裹POST /test/_search{ "query": { "match": { "desc": "芒" } }, "highlight": { "fields": { "desc": {} } }
2020-09-12 17:08:47
321
原创 ElasticSearch中keyword和text的区别
keyword:存储数据时候,该类型的字段不会分词建立索引text:存储数据时候,会自动分词,并生成索引PUT /test{ "mappings": { "properties": { "name":{ "type": "keyword" }, "desc":{ "type": "text" } } }}POST /test/_doc{ "name":"梦露", "desc":"性感
2020-09-12 13:05:55
2950
2
原创 SpringCloudAlibaba整合Dubbo
文章目录构建服务接口构建服务接口提供方Spring Cloud是一套较为完整的架构方案,而Dubbo只是服务治理与RPC实现方案。Dubbo的注册中心采用了ZooKeeper,而Spring Cloud体系中的注册中心并不支持ZooKeeper。直到Spring Cloud Alibaba的出现,才得以解决这样的问题,Spring Cloud Alibaba中的Nacos来作为服务注册中心,并且在此之下可以如传统的Spring Cloud应用一样地使用Ribbon或Feign来实现服务消费,并提供了Sp
2020-09-01 15:56:27
10178
3
原创 SpringBoot自动装配分析总结
文章目录@SpringBootApplication三个最重要的注解@SpringBootConfiguration或@Configuration@ComponentScan@EnableAutoConfiguration@ImportImportSelectorBeanDefinition@SpringBootApplication三个最重要的注解组合注解@SpringBootApplication注解中三个最重要的注解:@SpringBootConfiguration(底层实际是@Configur
2020-09-01 00:34:34
449
1
原创 根据配置文件创建Spring容器(上下文)的常见方式
BeanFactoryBeanFactory【Bean工厂】是接口,是IOC容器的最顶层接口,为IOC容器的具体实现提供了规范。BeanFactory和ApplicationContext是Spring的两大核心接口,其中ApplicationContext是BeanFactory的子接口,而WebApplicationContext是ApplicationContext的子接口我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文。...
2020-08-31 11:35:10
699
原创 Nacos作为配置中心
文章目录Nacos的四大作用Nacos的安装Nacos的四大作用服务发现与服务健康检查动态配置管理动态DNS服务Nacos提供了基于DNS协议的服务发现能力,旨在支持异构语音的服务发现,支持注册到Nacos的服务以域名的方式暴露端点服务和元数据管理Nacos的安装下载:https://nacos.io/zh-cn/docs/what-is-nacos.html进入nacos的安装目录,并启动nacoscd /usr/local/nacos/binsh startup.sh -m
2020-08-23 22:40:44
1023
原创 application配置文件优先级、bootstrap和application的区别
文章目录bootstrap.yml和application.yml的区别高级应用SpringBoot默认支持properties和YAML两种格式的配置文件bootstrap.yml和application.yml的区别(1)加载顺序bootstrap 由spring父上下文加载,比application配置文件优先加载,而application配置文件由子上下文加载bootstrap加载的配置信息不能被application的相同配置覆盖(2)配置区别bootstrap常见应用场景:
2020-08-22 23:49:37
16010
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人