自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 RabbitMQ简单入门

一、关于MQ的介绍消息队列MQ是一种应用之间异步通信的方式,主要是由三个部分组成:第一个是生产者(producer),生产者也就是说生产消息的这一端,然后主要是负责消息所承载业务信息的一个实例化,是我们整个消息的发起方;第二个是Broker,它是我们整个消息的服务端,主要是去处理我们这个消息单元,它负责消息的存储、投递以及队列的一些其他附加功能的实现,它是整个消息队列里面最核心的组成部分;第三个消费者(consumer),主要负责消息的消费,具体是根据消息所承载的一个信息去处理各种业务逻辑。市面上几款比

2022-03-26 16:49:31 2635

原创 MySQL查询的执行流程

2022-03-22 19:55:42 1171

原创 微服务之Redis中缓存击穿、缓存穿透和缓存雪崩

大部分人都知道Redis是用来做缓存的,那么关于缓存的三个常见问题,我们来聊一聊。Redis中关于缓存常见的三个问题是:缓存穿透、缓存击穿和缓存雪崩。在谈这三个问题之前,我们先来了解一下缓存处理的流程。一、缓存处理流程缓存的执行流程如图,客户端发送请求,会先判断缓存中是否存在数据,存在即返回数据,不存在才会去请求DB,假如数据库不存在该数据,则返回null值,存在则表示该数据此前没有查询SQL,就会去更新缓存的数据,并把查询结果以key-value的形式保存在缓存中。二、缓存穿透、缓存击

2022-03-22 19:47:01 400

原创 微服务之RabbitMQ消息发送幂等性问题(下)

大家设想下面一个场景:消费者在消费完一条消息后,向 RabbitMQ 发送一个 ack 确认,此时由于网络断开或者其他原因 导致 RabbitMQ 并没有收到这个 ack,那么此时 RabbitMQ 并不会将该条消息删除,当重新建立 起连接后,消费者还是会再次收到该条消息,这就造成了消息的重复消费。同时,由于类似的原因,消息在发送的时候,同一条消息也可能会发送两次。种种原因导致我们在消费消息时,一定要处理好幂等性问题。幂等性处理也不是很难,基本上都是从业务逻辑上面处理,我来讲述一下大致的思路。

2022-03-13 23:46:33 2740

原创 微服务之RabbitMQ消息发送失败重试(上)

本博客讲述的是RabbitMQ基于AMQP协议的消息中间件,在互联网应用的开发中,RabbitMQ是确保消息发送和消费成功,设置消息有效期和延迟队列的一个重要的中间件。它的特点具有安全性、可用性、集群、多协议支持、可视化客户端等等。关于他的详细介绍和作用就不一一赘述了,下面引用一个邮件发送的案例来加深理解。搭建一个简单的邮件发送服务,需要用到的开发工具有IntelliJ IDEA,RabbitMQ、MySQL,Postman用来作为测试接口。案例介绍:假如现在某公司新招聘了一批员工,需要给新员

2022-03-12 15:00:07 6338

原创 SpringBoot的Aop应用(超简单)

这是一篇基于SpringBoot非常简单的Aop应用。首先我们在配置Aop时先了解一下SpirngBoot 2.0前后的新特性。1.Spring Boot 2.0 之前的动态代理,有接口,就使用jdk动态代理,没接口,就使用cglib动态代理2.从 Spring Boot 2.0 开始,动态代理统一使用cglib,无论被代理的对象有没有接口到这里我们先来看看准备工作。aop应用,我们只需要添加这样一个spring-boot-starter-aop依赖。这是我的包结构。首先

2022-02-10 21:16:21 898 2

原创 SpringBoot全局异常处理机制和配置拦截器

关于SpringBoot的全局异常处理,其实十分简单。首先,要新建一个SpringBoot项目添加两个依赖,spring-boot-starter-web和spring-boot-starter-thymeleaf。这个时候,我们便可以把异常信息展示在thymeleaf页面。编写接口:以往的SpringMVC配置在SpringBoot项目中依然生效。所以可以通过实现HandlerExceptionResolver接口或者添加@ExceptionHandler注解来处理全局异常。@C

2022-02-10 20:25:17 2255

原创 SSM框架整合

一、前言SSM框架的整合实际上就是Spring开源框架对SpringMVC(Spring框架的一部分)框架和Mybatis框架的整合,简称SSM。二、基本概念在项目开发中,几乎使用的都是B/S架构的开发,也就是浏览器和服务器。JavaEE中定义三层架构的标准是:表现层、业务层、持久层。其中每一层任务都分工明确。表现层:负责接收客户端发送的请求,响应客户端请求的结果。多用于用户和服务端进行交互,呈现视图。表现层的设计一般基于MVC架构模型。业务层:又称业务逻辑层,主要是针对用户不同的

2022-01-17 22:52:15 1233

原创 初识SpringMVC

SpringMVC引言SpringMVC是java的开源框架之一,是Spring Framework的一个独立模块,MVC框架在项目中提供了MVC层次架构,对控制中的功能包装、简化,扩展践行工厂模式,功能架构在工厂之上。MVC架构:名称 职责 Mode 模型:即业务模型,负责完成业务中的数据通信处理,对应项目中的 service和dao View 视图:渲染数据、生成页面。对应项目中的Jsp Controller 控制器:直接对接请求,控制MVC流程,调度模型

2022-01-15 16:03:58 251

原创 Java代码配置SpringMVC

纯Java代码配置SpringMVC原理跟xml和注解结合配置一样,pom.xml依赖中需要额外添加一个依赖javax.servlet-api,将来会在WebInit中用到。本博客详细可以参考上一篇文章。废话不说,下面直接上代码。resource资源包只需要new一个File配置db.properties:db.username=rootdb.password=rootdb.driver=com.mysql.cj.jdbc.Driverdb.url=jdbc:mysql://...

2022-01-14 00:01:43 536

原创 Spring整合SpringMVC

本博客将会运用Spring+SpringMVC整合连接数据库做一个简单的数据查询操作。本次整合运用的知识点有XML和Config配置的结合使用,整合环境的搭建,数据库的连接等。首先我们拿到需求后第一步要做的事,就是创建一个Maven工程,因为要用到SpringMVC,所以我们需要把Maven工程打包成一个web工程,打包的步骤很简单就不一一赘述了,此时src目录底下的main目录下面应该有三个包,分别是java代码包、resource资源包、webapp web工程包。war包底下应该是WE...

2022-01-13 22:37:32 953

原创 SpringMVC实现文件上传与下载

基于JavaWeb实战开发中的Servlet实现文件上传和下载的操作,org.springframework:spring-webmvc依赖为SpringMVC提供了multipart解析器和MultipartFile的一些文件操作方法,使文件上传变得更加方便简单。

2022-01-12 23:28:52 448

原创 SpringMVC拦截器

拦截器是一种AOP风格的过滤器,具体的执行顺序是:过滤器--->拦截器--->处理器。SpringMVC拦截器的作用是抽取handler中的冗余功能(拦截的是处理器Controller中的方法)。Maven配置类: 下面定义一个测试类,在页面上面响应一句话Hello good morning!!//注解的含义:包含 @Controller 和 @ResponseBody@RestControllerpublic class HelloCon...

2022-01-12 11:09:40 136

原创 SpringMVC异常解析器

现有的方案中Controller中的每个Handler自己处理异常,这种异常处理的异常处理逻辑分散在各个Handler中,不利于集中管理。为此,Spring提供了一个全局异常捕获的功能--->异常解析器,这个功能在集中管理异常的方面,对比传统的方法更有优势。异常解析器共有三种处理方式:1.实现 HandlerExceptionResolver接口(掌握)2.通过 @ExceptionHandler 注解定义(掌握)3.SimpleMappingExceptionReso...

2022-01-11 21:11:35 343

原创 事务传播行为

事务传播行为是为了解决业务层方法之间互相调用的事务问题。当事务方法被另外一个事务方法调用时,必须制定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事物,并在自己的事务中运行。举个例子!我们在A类的方法中调用了B类的方法。这个时候就涉及到业务层方法之间互相调用的事务问题。如果我们的如果发生异常需要回滚,如何配置事务传播行为才能让也跟着回滚呢?这个时候就需要事务传播行为的知识了。Class A { @Transactional(propagation=propa

2022-01-08 17:50:34 415

原创 Servlet的文件上传功能

Servlet3.0之前:需要使用一个第三方库:Apache Commons FileuploadServlet3.0之后:依然可以添加依赖,而且增加了 Servlet 自带的文件上传方案import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http

2022-01-03 22:28:16 1148

原创 前端---CSS

一 CSS概念1.1css是什么 层叠样式表是一种用来表现HTML或XML(HTML子集)等文件样式的计算机语言,CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。1.2css能做什么1css主要用于来美化网站2使用css样式的时候与html代码进行分离提高代码的扩展性与清晰度1.3css基本的语法语法://选择器指修饰html的标签,声明指需要具体修饰的样式选择器{ 声明}注意点:需要...

2021-12-04 16:38:02 619

原创 前端---HTML

一 HTML是什么 HTML的全称是超文本标记语言,是一种标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等,是人与计算机进行交互的桥梁。二 HTML能做什么 HTML就是用于做网站,HTML是一个网站的主体部分,所有网站都是使用HTML来进行描述。Web前端三大剑客:HTML:主要用于做网站(...

2021-12-04 14:00:47 229

原创 线程和多线程

进程指的是程序执行的基本单位,程序由一个或者多个进程组成。线程指的是CPU执行的基本单位,进程是有一个或者多个线程组合合成。线程是由CPU调度执行,多线程是CPU不断地来回切换调度不同的线程执行的结果。多线程的创建方式:1、自定义线程类继承Thread类,重写run()方法,main方法实例化自定义线程类,通过对象调用start()开启线程 2、自定义任务类实现Runnable接口,重写run()方法,main方法实例化自定义任务...

2021-11-19 23:28:45 547

原创 IO流知识梳理

IO流分为两大类,分别是字节流和字符流根据数据传输方向划分(以程序为参照物),分为输入流和输出流。输入流指的是从文件>程序(读取数据),输出流是程序>文件(写出数据)。根据读写的单位进行划分,分为字节流和字符流。字符流的单位是字符,字节流的单位是字节(Byte)。根据功能进行划分,分为基础流和包装流。字节输入流的抽象父类是InputStream,输出流的抽象父类是OutputStream字符输入流的抽象父类是Reader,输出流的抽象父类是Writerimp..

2021-11-18 23:22:42 346

原创 创建方法如何删除指定目录

import java.io.File;public class Demo01{ public static void main(String[] args){ //指定目录一个需要删除的目录 delete("X:\\X\\File"); } //创建 delete 方法 传递参数 --绝对路径 public static void delete(String str){ //创建 File 对象 传递需要删除的绝对.

2021-11-17 20:52:30 432

原创 字符流和字节流拷贝文件

使用字符流拷贝文件:import com.qf.ran.utils.IOUtils;import org.junit.Test;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Demo01{ @Test public void method(){ FileReader fr = null; FileWrite

2021-11-17 19:14:07 600

原创 Collection集合和Map集合的知识梳理

Set集合的特点:无序不可重复HashSet集合:无序不可重复,可以存储 null 对象A:底层代码是哈希表(动态数组)+链表+红黑树B:存储自定义对象,需要重写 hashCode() 方法和 equals() 方法通过 HashSet 存储对象,会根据对象的 hashCode() 生成hash值,根据 hash 生成索引,根据索引找到 hash 表中的位置;判断位置上是否有对象,没有对象直接插入,有对象则通过 equals() 判断内容是否相同,如果相同则不插入,不同则根据链表往下检索,直

2021-11-15 20:57:34 426

原创 Map集合(调用迭代器、比较器)

map集合是指提供key到value的映射的集合。以键值对形式存储对象,key-value既有联系也无联系,有联系在于一个key值对应一个value值,通过key值可以找到对应的value值,类似于我们在查字典的时候,根据页码查找我们所需要的资料。以学生类来说,key相当于学号,value对应各种姓名...

2021-11-12 21:01:11 720

原创 自然排序和比较器

Set:无序不可重复TreeSet:无序可排序,不可重复,不能存储 null 对象的集合,使用 TreeSet 存储对象,对象类要么实现自然排序,要么传递比较器自然排序:存储进 TreeSet 集合的对象类必须实现 Comparable 接口,重写 comparaTo(),在 comparaTo()里指定排序规则,返回正数存储的对象往右子树方向,返回负数存储的对象往左子树方向,返回0则不存储比较器:在创建 TreeSet 集合对象的时候,传递 Comparator 接口的实现类对象,重写 Com

2021-11-11 23:06:54 754

原创 Collections(收集)

Collections是针对Collection的一个工具类,多用来解决各种集合的搜索、排序、线程安全化等操作。Collection是一个集合框架的父接口,接口的意义是为各种具体的集合提供了最大化统一的操作方式。import java.util.ArrayList;import java.util.Collections;public class Demo01{ public static void main(String[] args){ ArrayList<

2021-11-11 19:33:07 413

原创 关于泛型的特点和方法

泛型:约束了集合存储对象的数据类型public class Demo07 { public static void main(String[] args) { ArrayList<User> list = new ArrayList<>(); list.add(new User(1,"zs")); /*list.add("a"); list.add("b"); list.add(1);

2021-11-10 23:52:59 264

原创 Collection:Vector、Stack、Queue

Vector:元老级别的集合,底层是动态数组,线程安全的集合public class Demo03 { public static void main(String[] args) { Vector vector = new Vector(); vector.addElement("a"); vector.addElement("b"); vector.addElement("c"); //遍历数据

2021-11-10 23:48:11 228

原创 Collection:ArrayList和LinkedList的区别

ArrayList:底层是动态数组,通过无参构造方法创建集合对象,第一次添加对象时,容量会扩容为10,当容量满的时候再添加对象会扩容为原来的1.5倍ArrayList的底层代码:LinkedList:底层是双向链表,first属性指向第一个节点,不存在索引,理论上长度无限LinkedList的底层代码:...

2021-11-10 23:38:25 507

原创 Java基础(内部类)

import java.util.Arrays;// 数组扩容public class Demo03 { public static void main(String[] args) { int[] nums = {1,2,3,4,5,6}; nums = grow(nums); //索引为7的值赋值为8 nums[7] = 8; System.out.println(Arrays.toString.

2021-11-10 20:38:10 208

原创 Java基础(== 和 equals()的区别)

很多人会忽略判断==和判断equals()的区别,也有不少人认为==和equals判断方法就是一致的,那不妨试想一下,两种一致的判断类型,怎么会有两种不同的写法呢。有一种很多人都知道的区别,==能用来判断int类型的数据,但判断string类型的数据会报错,因此equals方法的判断便是用来解决这个问题的。...

2021-11-09 21:00:03 305

原创 数据类型拆装和char类型字符的判断

把基本数据类型转化成包装类(装箱)public class Demo01{ public static void main(String[] args){ //手动装箱 int num1 = 1; Integer integer = new Integer(num1); System.out.println(integer); //int类型装箱 Integer.valueOf() Integer

2021-11-09 20:47:26 438

原创 Java中try catch的用法和如何抛出异常

Throwable:异常和错误的父类 Error:错误 Exception:异常 1、受检性异常(一般异常) 编译时期出现异常 2、非受检性异常(运行时异常) 运行时期出现异常异常类型:at通常后面接异常位置(双击即可跳转异常位置)...

2021-11-08 21:07:10 9643

原创 Java内存分析(图)

内存分为三个模块:1、堆:实例化对象2、方法区:常量池、静态化和字节码文件3、栈:局部变量和栈帧(main方法)

2021-11-08 19:56:47 229

原创 面向对象(抽象和接口)

abstract意为抽象的意思,如我们在百度搜索“动物”图片,出现一堆动物子类的对象,但是并没有“动物”这种对象。再譬如我们看到一幅抽象画,你觉得它像什么,他又觉得它像什么,她又看到不一样的东西,这些就是抽象。abstract在程序中的含义是把一个类抽象化,抽象类可以有方法和属性,但抽象的方法并不能有方法体。继承这个类的子类必须重写抽象方法。abstract:抽象的1、abstract修饰的类为抽象类,修饰的方法为抽象方法,抽象方法没有方法体只能存在抽象类2、普通子类继承抽象类,必须重写抽象

2021-11-06 17:11:52 95

原创 面向对象(重载和重写的区别、final的特点)

重写的快捷键:Alt + Insert@Override():验证方法是否为重写的方法 重写:父类方法无法满足子类需求 1、必须发生在继承关系中 2、方法名相同 3、参数列表一致 4、子类重写的方法返回值必须跟父类方法的返回值一致 5、子类重写的方法访问修饰符必须跟父类的访问修饰符权限一样或者权限更大 ...

2021-11-06 14:50:37 211

原创 面向对象(继承)

继承:extends -- 多个类存在相同的属性或者方法 把相同的属性或者方法抽取到父类中然后子类继承 1、一个子类只能继承一个父类,不能继承多个父类 2、子类无法访问父类私有的属性和方法 3、子类无法继承父类的构造方法...

2021-11-04 20:56:41 91

原创 面向对象(构造方法,全局/局部变量,toString,this,static的概念和运用)

构造方法:不能有返回值,方法名和类名一致,初始化属性 访问修饰符 方法名(){ }无参构造方法默认存在当有参构造方法创建的时候,默认的无参构造方法会消失需要使用的时候必须手动创建无参构造方法:初始化属性与创建对象有参构造方法:创建对象的同时给一个或者多个属性赋值 -- 无参+多个set()构造方法 -- 初始化属性get() -- 获取单个属性的值set() --...

2021-11-03 21:00:00 131

原创 编程基础(算法和排序)

二分查找法:nums:被查找的数所在的数组num:被查找的数return:被查找数的索引,不存在则返回-1public class Demo01{ public static void main(String[] args){ int[] nums={1,3,5,7,9,11,15,17,19,23,25}; int num=20; int index=select(nums,num); if(index==-1){

2021-11-02 21:01:03 110

原创 编程基础(数组)

数组的概念:一组连续的储存空间,存储多个相同数据类型的值。特点:1、类型相同2、长度固定3、拥有索引(下标),从0开始,长度为初始值+1定义数组分为动态初始化和静态初始化动态初始化:先定义长度,在赋值String[] names = new String[4]静态初始化:定义长度的同时直接赋值//写法一String[] names = new String[]{"a","b","c","d"};//写法二String[] names;names = n

2021-11-01 20:39:18 596

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除