java
文章平均质量分 62
wang_yi_l
每天进步一点
展开
-
Nacos配置热更新的4种方式、读取项目配置文件的多种方式,@value,@RefreshScope,@NacosConfigurationProperties
nacos热更新,@value,@NacosPropertySource,@ConfigurationProperties,@NacosConfigurationProperties,@RefreshScope原创 2022-04-24 17:46:44 · 30730 阅读 · 16 评论 -
windows启动jar nacos yaml配置文件中包含中文问题
yaml配置文件中文启动报错原创 2022-04-20 16:38:21 · 2871 阅读 · 0 评论 -
Mysql索引原理、聚簇索引和非聚簇索引、回表
我们都知道索引的作用是增加查询速度,大部分系统都是读多写少,索引对应查询的帮助是非常大的。特别是数据流越大的时候,索引对应查询性能的影响非常关键。就好比一本字典,如果没有目录,想要找一个字的话就要一页一页的查找,非常耗时,通过字典里面的目录就可以直接定位到数据在哪一页,这样查找效率就非常高。索引就类似字典里面的目录。一、索引的底层数据结构1、Hash(哈希表)哈希算法也叫散列算法,就是把任意的key通过哈希函数转变为固定长度的地址。2、B+树Mysql默认使用的就是B+树,B+树是一种平衡查找树。原创 2022-03-08 14:52:59 · 1758 阅读 · 0 评论 -
Mysql事务隔离级别、事务的ACID、事务的传播行为
一、事务的ACID特性1、原子性(Atomicity):事务开始后的所有操作要么全部成功,要么全部失败,不能停在某一个环节,如果执行过程中出错,要回滚到操作之前。2、一致性(Consistency):事务开始前和结束后,数据库的的完整性没有被破坏,比如A向B转账,不能A账号钱扣了,而B没有收到转账。3、隔离性(Lsolation):同一个数据在同一时间只允许一个事务处理,不同事务直接的操作彼此直接没有干扰,比如A正在给B转账,A给B转账结束前C不能给A转账。4、持久性(Durability):原创 2021-01-20 14:28:43 · 581 阅读 · 0 评论 -
@Transactional注解失效的场景,为何会失效
@Transactional是我们项目中很常用的一个注解了,@Transactional可以为我们控制事务,可以保证事务内的操作要么全部成功,要么全部失败,@Transactional也是基于AOP切面实现事务的功能的。下面列举一下使用@Transactional会导致事务失效的场景:1、@Transactional应用在了非publice的方法上,事务将会失效:原因是SpringAOP对事务进行代理增强的时候会调用到computeTransactionAttribute方法,这个方法里面进行了判断,原创 2021-12-18 14:36:25 · 3677 阅读 · 0 评论 -
理解MVC架构模式,SpringMVC原理、执行流程图解
1、MVC架构模式说起SpringMVC就不得不说MVC,MVC是一种经典架构模式。MVC架构模式的重点是为了解耦,将软件用户界面和业务逻辑分离以使代码可扩展性、可复用性、可维护性、灵活性加强,很多应用程序的问题在于处理业务数据和显示业务数据的视图的对象之间存在紧密耦合。有一句很有名的话:一个层次的重定向几乎可以解决计算机业务中的所有问题。在模型(Model)和视图层(View)之间引入重定向层可以解决解耦问题,这个重定向层就是控制层(Controller)。这样模型和视图就实现了代码分离,解耦了,由控原创 2021-12-15 12:08:49 · 3784 阅读 · 0 评论 -
请求转发和重定向的区别
1、什么是请求转发和重定向?请求转发:request.getRequestDispatcher(String path).forward(requst,response);重定向response.sendRedirect(String path);简单来说,请求转发是服务端内部做的事情,和客户端无关,客户端也无感知;而重定向是客户端请求服务端,服务端重定向,客户端在发起二次请求才能拿到结果。2、请求转发和重定向的区别1、重定向是response发起,请求转发是request发原创 2021-12-14 10:49:23 · 591 阅读 · 0 评论 -
JDK8 lambda操作list常用功能,list转map,list选取字段拼接字符串,分组,统计
新建UserDTO对象:package com.list;import lombok.Data;@Datapublic class UserDTO { public UserDTO(){} public UserDTO(Integer id, String userName, String mobile){ this.id = id; this.userName = userName; this.mobile = mobile;原创 2021-11-18 11:23:11 · 7809 阅读 · 1 评论 -
Spring AOP 面向切面编程,XML和注解方式使用切面
一、AOPAPO即Aspect Oriented Programing的缩写,字面直译的意思就是:面向切面编程。AOP采用横向抽取机制,取代了传统的纵向继承体系中的重复性代码,是对OOP面向对象编程的一种补充和完善。AOP最重要或者说要达到的目的就是开发者在不修改不侵入源代码的前提下,给系统中的业务组件添加某种通用的功能。比如现在要统计系统中service层的所有方法的执行时间,如果使用面向对象的话只能在每个方法前后手动编写一段代码打印开始结束时间,来计算每个方法的执行时间;如果使用AOP就可以把计算原创 2021-11-16 17:12:52 · 1206 阅读 · 0 评论 -
Spring ioc 通俗易懂的讲清楚什么是IOC、DI
1、IOC的理论背景我们都知道,在采用面向对象方法设计的软件系统中,系统底层都是有N个对象组成,所有的对象通过彼此的合作最终完成系统的业务逻辑。图1:软件系统中的耦合对象当我们打开机械手表的后盖,就会看到如图一上面的类似情景,各个齿轮分别带动时针、分针、秒针顺时旋转,从而在手表上显示正确的时间。图一就是描述的这样一个齿轮组,它拥有多个独立的齿轮,这些齿轮互相啮合在一起,协同工作,共同完成某项任务。我们可以看看到,在这样的齿轮组中,如果有一个齿轮出现了问题,就可能会影响到整个齿轮组的正常运转。齿轮组中转载 2021-11-12 15:10:22 · 579 阅读 · 0 评论 -
IDEA使用maven插件MyBatis Generator自动生成java实体类代码
1、在项目的pom.xml文件中添加plugin插件<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <v原创 2021-11-10 15:20:39 · 1775 阅读 · 0 评论 -
Hibernate框架介绍,一级缓存二级缓存
一、Hibernate介绍1、Hibernate是一种ORM框架,也就是持久层的框架,应用于DAO层,是对JDBC的一种封装,可以让程序直接通过面向对象的方式去完成对数据库的操作,可以做到不用手写SQL语句就能完成对数据库的各种操作。2、ORM框架,那么什么是ORM?O:ObjectR:RelationalM:MappingORM就是对象关系映射(Object Relational Mapping,简称ORM),关注的是对象和数据库中对应表的关系。通过描述对象和数据库之间映射的元数据,将程序中原创 2021-10-29 10:56:33 · 727 阅读 · 0 评论 -
jvm类加载器,java有哪些类加载器,有什么作用
一、什么是类加载器类加载器ClassLoader就是将我们的.class文件转换成Class对象。类Class只有被加载到jvm中后才能运行,jvm会将编译生成的字节码.class文件加载到内存中,组织成一个完整的java应用程序,这个过程是由类加载器ClassLoader和它的子类来完成的。二、jvm中的类加载器jvm中有三个类加载器:1、引导类加载器:BootStrap,它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader2、扩展类原创 2021-09-29 14:25:21 · 1936 阅读 · 0 评论 -
java将文件夹和里面的所有文件打包成zip或rar并导出,亲测好用
有一个项目需要将文件夹里面的所有文件压缩成zip并导出下载,并且保留原来文件夹里面的所有目录结构,找了一些资料整理了一下。上代码:import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.net.URLEncoder;import java.tex原创 2021-08-23 10:36:35 · 6201 阅读 · 13 评论 -
java Enum枚举的原理,看编译后的源码
一、java中的枚举Enum是jdk1.5开始引入的一个新的类型,为开发提供了很大的便利。enum是一个特殊的class,实际上枚举声明定义的类型就是一个类。比如下面的一个枚举,我们通过反编译工具可以看到编译后的内容:public enum ColourEnum { RED(1, "红色"), BLUE(2, "蓝色"), BLACK(3, "蓝色"); // 成员变量 private int state; private String colour原创 2021-08-18 15:40:21 · 1823 阅读 · 0 评论 -
java反射介绍、使用、获取成员变量、获取成员方法执行
反射在java中是非常强大的一个技术,很多框架内部都使用到了反射。一、反射是什么,如何理解?反射中包含了一个“反”字,要理解“反”的意思,就要知道“正”的意思。一般情况下我们使用某个类的时候都知道这是什么类,用来做什么,如何初始化,有什么属性和方法,例如有一个User类:public class User { private Long userId; private String userName; public String sex; public User(){原创 2021-08-06 11:12:03 · 1928 阅读 · 0 评论 -
java多线程、生命周期、start和run的区别、wait和sleep的区别
1、经常说多线程,那什么是线程,什么是多线程?线程是操作系统能够进行调度的最小单位,线程包含在进程中,是进程的实际运作单位。一个进程至少包含一个线程,可以有多个线程,每个线程可以执行不同的任务。一个进程可以理解为系统中运行的一个应用程序。2、多线程的好处采用多线程可以更好的利用系统资源,可以充分利用CPU的空闲时间,可以更快的提高程序的响应速度,可以设置不同任务的优先级顺序。3、java如何实现多线程继承Thread类,重写run方法;实现Runnable接口,重写run方法;使用线程池;原创 2021-07-21 16:42:15 · 576 阅读 · 3 评论 -
IO简介、IO流的体系结构
什么是IO?IO就是Input,OutPut的简称,即输入输出。对计算机来说,计算机的核心CPU和内存,于其他设备之间的数据转移就是IO,比如数据从磁盘读到内存,数据从内存写入到磁盘都是IO操作。Java中输入输出是相对于Java程序而言,常见的上传图片,图片上传到程序接口中,对于程序来说是输入;下载文件,对于程序来说是输出。Java中常见IO体系java中分为字节流和字符流,字节流是以字节为单位,字符流是以字符为单位。1、字节流a、字节输入流InpuptStream– FileInputS原创 2021-07-07 10:29:38 · 1207 阅读 · 0 评论 -
java正则替换ip地址,将字符串中的IP地址替换为指定内容
使用java替换字符串中的ip地址public static void main(String[] args){ String reg = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"; //匹配ip的正则 String str = "http://192.168.1.108/index.html"; String baidu = "www.baidu.c原创 2021-06-25 17:32:29 · 3190 阅读 · 0 评论 -
maven引入本地仓库jar包
java项目中使用maven引入本地仓库的jar包1、下载好要使用的jar包,我这里下载了专用钉钉的java jar包,命名sdk-java-1.2.0.jar2、找到自己本地仓库的文件夹,我的路径是D:\Java.m2\repository\,然后在repository文件夹里面新建文件夹com,在com文件夹里面新建文件夹ding,在ding文件夹里面新建文件夹sdk-java,在sdk-java文件夹里面新建文件夹1.2.0,然后把sdk-java-1.2.0.jar 这个文件放,1.2.0文件夹原创 2021-05-19 09:37:02 · 1708 阅读 · 0 评论 -
Bean注入@Autowried和@Resource的区别
开发过程中经常使用bean注入,常用的就是@Autowried和@Resource这两个注解。1、区别1、@Autowried是Spring自己定义的注解,而@Resource是属于J2EE的。2、@Autowried默认按照类型装配,默认情况下要求装配对象必须存在,如果允许null值,可以设置required属性为false;@Resource默认按照名称装配,可以按照name和type属性指定,如果没有指定,默认按照字段名称进行查找,当名称找不到是会按照类型进行装配。2、@Resource的装原创 2021-01-20 15:31:57 · 1214 阅读 · 0 评论 -
Java中==和equals的区别,原理,Integer超出-128和127使用==返回false
==和equals有什么区别?1、比较基本数据类型== 是比较两个基本数据类型的值是否相等equals 也是比较两个基本数据类型的值是否相等,因为这些基本数量类型的对象都重写了equals方法。 public static void main(String args[]){ int a = 12; int b = 12; System.out.println("基本数据类型比较:a==b-->" + (a== b));原创 2020-09-26 15:17:02 · 1308 阅读 · 0 评论 -
冒泡排序、选择排序、二分查找法
一、冒泡排序冒泡排序是一直比较简单的排序算法排序原理:这种算法的原理是重复访问要排序的数组,对相邻的两个元素进行比较,如果顺序错误就将两个元素的内容交换,一直到没有两个相邻元素需要交换,排序完成。这个算法名称的由来是由于在不断的元素比较交换过程中,较小的元素会慢慢的浮到数组的顶端,就像水中的气泡往上浮一样,故名"冒泡排序";java代码示例:public static void main(String args[]){ // 冒泡排序 // 定义一个数组原创 2020-09-22 15:19:55 · 681 阅读 · 0 评论 -
java面向对象的四大特性,抽象、封装、继承、多态
java是面向对象的语言,面向对象有四大特性:抽象、封装、继承、多态。一、抽象1、抽象就是将一个事务共有的属性和方法进行抽取。把多个类中相同的方法声明进行抽取,定义到一个类中。如果这个类中的方法只有方法声明没有方法体,这个方法就是抽象方法,有抽象方法的类一定是抽象类。2、抽象的特点:抽象类和抽象方法都要用abstract修饰;有抽象方法的类一定是抽象类,而抽象类不一定有抽象方法;一个类继承一个抽象类的时候,要么重写所有抽象方法,要么本身也是抽象类;抽象类不能被实例化;二、封装封装就是把抽象原创 2020-09-22 10:35:42 · 2205 阅读 · 1 评论 -
匿名内部类,lambda表达式list.forEach的时候引用变量必须是final修饰
匿名内部类,lambda表达式list.forEach的时候引用变量必须是final修饰的问题。开发中遇到过以下问题,使用list.forEach循环的时候,不能对外部变量进行操作,而且提示:Variable used in lambda expression should be final or effectively final意思是:lambda表达式中使用的变量应该是final或实际上是final这是因为lambda表达式list.forEach也是属于匿名内部类,匿名内部类实际上也是一个原创 2020-09-18 16:18:37 · 2029 阅读 · 0 评论 -
volatile关键字的作用,指令重排问题
java中volatile关键字的作用及原理1、保证内存可见性如下图所示,在jvm中,所有线程的共享变量都存在主内存中,然后每个线程有自己独有的工作内存,每个线程不直接操作主内存中的数据,而是将主内存中的变量变成一个副本存在自己的工作内存中,线程值操作自己工作内存中的变量。在单线程中不会出现问题,多线程的时候就可能出现脏数据!例如:int i = 1;AB两个线程同时拿到了变量 i,进行递增操作,AB两个线程都将i放到自己工作内存中进行+1操作,而此时A线程操作了 i 之后,还没有将结果刷新到主转载 2020-09-03 16:36:50 · 669 阅读 · 2 评论 -
JVM堆栈、值传递和引用传递
JVM里面堆栈的功能主要是分配内存空间,程序里面的方法、变量、对象都是JVM在内存中分配的。栈(stack)java栈是和每一个线程关联的,会为每一个线程分配栈空间。主要用来存放基本数据类型和对象类型的引用地址,栈是线程独享的,每个线程有自己的栈空间。栈空间随着线程的终止而释放。值传递:就是程序里面基本数据类型的传递,例如:int a = 10; 然后将a传递到别的方法里面,别的方法对这个值做了修改,初始的a的值是不会变的。堆(deap)主要用来存储new的对象,栈里面的引用指向这个对象。原创 2020-09-02 15:07:13 · 557 阅读 · 0 评论 -
进制间的相互转换,二进制转十进制,八进制转十进制,十六转十进制
1、什么是进制进制:就是进位制,规定的一种进位方法。对于任何一种进制 X ,标识在某一位上的数运算时,逢X进一。二进制:逢2进1,用0和1表示;八进制:逢8进1,0-7;十进制:逢10进1,0-9;十六进制:逢16进1,0-9,A-F(10-15);我们默认使用的是10进制计数。2、二进制和十进制的相互转换二进制----->十进制:计算公式:系数 * 基数 ^ 权次(这个公式适用于任何进制到十进制的转换)权次:从右到左的角标,从0开始 10100010 = 0*2^0 + 1原创 2020-09-01 10:48:58 · 2168 阅读 · 1 评论 -
JVM垃圾回收理解,垃圾回收算法、JVM堆内存分代模型
我们写java代码的时候,业务逻辑处理里面会产生很多对象,这些对象在调用结束后jvm的垃圾回收器GC就帮我们回收处理了,但是具体的逻辑是如何处理的,如何如优化。1、什么是垃圾?简单来说就是:没有任何引用指向这个对象,那这个对象对jvm来说就是垃圾,需要回收。2、jvm如何定位到这些垃圾?使用的什么算法jvm定位垃圾的算法有两种:1:引用计数器顾名思义,就是通过计数来判断这个对象是否被引用。当一个对象有引用时计数器+1,引用消失时计数器-1,当计数器为0的时候,对象不在被引用,也就标记为垃圾。原创 2020-08-18 11:41:31 · 923 阅读 · 0 评论 -
synchronized和Lock锁原理理解,CAS原理,锁升级策略
synchronized的原理synchronized底层是通过对象内部的一个监视器锁(monitor)来实现的,是由一对monitorenter/monitorexit指令实现的。什么是监视器锁?参考JVM对监视器锁的描述:monitorenter :Each object is associated with a monitor. A monitor is locked if and only if it has an owner. The thread that executes monit原创 2020-08-14 10:47:30 · 1248 阅读 · 0 评论 -
SpringCloud入门hello world,SpringBoot2.1.3,附采坑经历(附源码)
SpringCloud入门Hello worldSpringCloud是Spring开源的一个基于SpringBoot的分布式微服务框架。它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。而且是基于SpringBoot的,所以整合起来很方便!先解释一下SpringCloud的核心组件:SpringCloud五大核心组件1、Eureka:Eureka是Netflix开源的一个RESTful服务,也称服务注册中心。主要用于原创 2020-07-29 11:18:58 · 1133 阅读 · 0 评论 -
mybatis批量修改,批量新增
mybatis批量修改、批量新增sql语句1、单个新增<insert id="insert" parameterType="com.test.User"> INSERT INTO t_user (user_name,mobile) VALUES (#{userName}, #{mobile}) SELECT @@IDENTITY AS id </insert>2、批量新增<in原创 2020-07-13 16:09:13 · 16029 阅读 · 11 评论 -
java获取int类型的随机数
java获取int类型的随机数这个是获取从0到10的int型随数:int num = (int)(0+Math.random()*(10-0+1));公式:(数据类型)(最小值+Math.random()*(最大值-最小值+1))原创 2020-06-12 14:26:58 · 1393 阅读 · 0 评论 -
本地java项目提交到远程git仓库
本地java项目提交到远程到远程git仓库1:首先新建本地的java项目2:在IDEA里面依次点击 VCS -> Import into Version Control -> Create Git Repository3:第2步点击后会弹框,这时选择要提交的项目4:选中项目右击项目选择Git -> Add5:选中项目右击项目选择Git -> Commit Directory 将该项目提交到本地仓库6:新建远程git项目,并复制项目地址7:选择本地项目 右击 ->原创 2020-06-12 14:18:41 · 1552 阅读 · 0 评论