自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 curl命令行发送post/get请求

curl 是一个命令行实用程序,允许用户创建网络请求curl 在WindowsLinux和Mac上皆可使用。

2024-06-17 08:12:58 2966 130

原创 SpringBoot实现License认证(只校验有效期)

License也就是版权许可证书,一般用于收费软件给付费用户提供的访问许可证明应用场景应用部署在客户的内网环境这种情况开发者无法控制客户的网络环境,也不能保证应用所在服务器可以访问外网因此通常的做法是使用服务器许可文件,在应用启动的时候加载证书然后在登录或者其他关键操作的地方校验证书的有效性License授权原理使用开源的证书管理引擎生成密钥对,使用Keytool生成公私钥证书库授权者保留私钥,使用私钥和使用日期生成证书license。

2024-04-08 09:12:47 3765 27

原创 MyBatis-Plus(实用篇)

Wrapper:条件构造抽象类,最顶端父类AbstractWrapper:用于查询条件封装,生成sql的where条件QueryWrapper:查询条件封装UpdateWrapper:update条件封装AbstractLambdaWrapper:使用Lambda语法LambdaQueryWrapper:用于Lambda语法使用的查询WrapperLambdaUpdateWrapper:用于Lambda语法更新WrapperUserMapper中定义接口方法。

2022-12-22 23:41:47 8008 12

原创 Tomcat源码解析(八):一个请求的执行流程(附Tomcat整体总结)

前文中我们介绍了NIO解析请求数据,网络字节流转化为Request和Response对象。接下来介绍拿到Req和Res之后如何走到Servelt,以及正常响应返回。回顾之前篇章,NioEndpoint通过socket服务端监听8080端口接收连接,获取到连接扔给连接池处理,SocketProcessor从NioChannel通道中读取数据到ByteBuff缓冲区再赋值给对应属性,最后通过适配器生成容器Req和Res调用容器管道的执行方法。Endpoint是连接器Connector。

2024-06-10 15:22:25 2600 160

原创 idea实用快捷键(持续更新...)

【代码】idea实用快捷键(持续更新...)

2024-06-03 08:09:33 2236 163

原创 Tomcat源码解析(七):底层如何获取请求url、请求头、json数据?

前文中我们介绍了连接器的初始化和启动,实际就是EndPoint的初始化启动,EndPoint主要负责接收socket请求,然后将socket请求包装为SocketProcessor对象(实现Runnable接口)扔给线程池Executor处理。接下来介绍NIO如何解析请求数据,网络字节流与Request和Response对象的转化。Nio通过NioChannel将请求数据读取到ByteBuffer缓冲区中先解析请求行,包括请求方式、请求url、请求协议再解析请求头的name和value解析都是通过。

2024-05-27 09:05:14 1870 127

原创 Tomcat源码解析(六):Connector、ProtocolHandler、Endpoint

前文中我们介绍了容器Engine、Host、Context、Wrapper的启动,代表整个tomcat容器启动就算完成了。接下来介绍下连接器,处理Socket连接,负责网络字节流与Request和Response对象的转化。Tomcat设计了3个组件。Endpoint(网络通信)负责提供字节流给Processor;Processor(应用层协议解析)负责提供Tomcat Request对象给Adapter;Adapter(请求响应转化)负责提供ServletRequest对象给容器。

2024-05-20 09:12:53 2777 115

原创 ThreadLocal全面解析

ThreadLocal类用来提供线程内部的局部变量这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量ThreadLocal实例通常来说都是类型的,用于关联线程和线程上下文使用场景及作用线程并发: 在多线程并发的场景下传递数据: 我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量线程隔离: 每个线程的变量都是独立的,不会互相影响ThreadLocal并不解决线程间共享数据的问题ThreadLocal适用于变量在线程间隔离且在。

2024-05-13 09:09:05 2748 58

原创 Maven详解

1)数学中的坐标使用 x、y、z 三个『向量』作为空间的坐标系,可以在『空间』中唯一的定位到一个『点』2)Maven中的坐标和 Java 类一样,POM 之间其实也是单继承的。如果我们给一个 POM 指定了父 POM,那么继承关系如下图所示:在 POM 的继承关系中,子 POM 可以覆盖父 POM 中的配置如果子 POM 没有覆盖,那么父 POM 中的配置将会被继承按照这个规则,继承关系中的执行命令:mvn help:effective-pom超级 POM:所有 POM 默认继承,只

2024-05-06 09:04:35 2762 31

原创 java开发常用工具类(持续更新...)

【代码】java开发常用工具类(持续更新...)

2024-04-29 09:33:06 1575 42

原创 详解Java中的五种IO模型

在学习IO模型前,需要先了解些基础概念,才能理解IO的执行流程及阻塞的原因selectpollepoll底层数据结构数组链表红黑树和双链表获取就绪的fd遍历遍历事件回调事件复杂度O(n)O(n)O(1)最大连接数1024无限制无限制fd数据拷贝每次调用select,需要将fd数据从用户空间拷贝到内核空间每次调用poll,需要将fd数据从用户空间拷贝到内核空间使用内存映射(mmap),不需要从用户空间频繁拷贝fd数据到内核空间。

2024-04-22 07:36:30 2642 27

原创 NIO详解

NIO (New lO)也有人称之为java non-blocking lO是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java lO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。NIO可以理解为非阻塞IO。

2024-04-15 09:51:07 2292 60

原创 Tomcat源码解析(五):StandardEngine、StandardHost、StandardContext、StandardWrapper

前文中我们介绍了StandServer与StandService的init与start方法,而Service的init方法和start方法则是调用顶级容器Engine、请求url映射Mapper、执行器Executor、连接器Connector的init和start方法。本文就介绍下容器的init和start及Mapper的组成。至此,整个容器的启动过程就介绍完了,可以看到整个流程是由Server起步直到Wrapper结束。

2024-04-01 08:58:13 2711 26

原创 MyBatisPlus新版代码生成器(Velocity模板引擎详解)

Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 ,填充到模板中,从而实现界面和java代码的分离。应用场景Web应用程序 : 作为为应用程序的视图, 展示数据源代码生成 : Velocity可用于基于模板生成Java源代码自动电子邮件 : 网站注册 , 认证等的电子邮件模板网页静态化 : 基于velocity模板 , 生成静态网页只需要关注.vm结尾模板即可(属于velocity引擎模板),其他模板是其他模板引擎的模板,这里不做过多介绍。

2024-03-25 07:08:52 3118 96

原创 EasyExcel实现文件上传下载(百万级数据、单元格自定义样式)

Java解析、生成Excel比较有名的框架有Apache poijxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。EasyExcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;

2024-03-18 07:32:55 2889 64

原创 Tomcat源码解析(四):StandardServer和StandardService

前文Tomcat源码解析(二):Bootstrap和Catalina介绍Tomcat的启动类的加载,在Catalina初始化时加载了server.xml,创建ServerServiceConnector等一些列组件,然后调用Server的init和start方法,启动tomcat。Tomcat源码解析(三):LifeCycle生命周期管理介绍了组件init、start、stop等共同生命周期方法,使用模板方法设计模式,具体的实现类由子类去实现。

2024-03-11 07:42:14 2207 108

原创 Tomcat源码解析(三):LifeCycle生命周期管理

在前文中我们介绍了tomcat的启动类加载核心内容就是getServer().init()组件的初始化和getServer().start()启动服务由于所有的组件均存在初始化启动停止等生命周期方法,拥有生命周期管理的特性基于生命周期管理抽象成了一个接口Lifecycle组件Server、Service、Container、Executor、Connector组件,都实现生命周期的接口监听器处理生命周期方法生命周期状态。

2024-03-05 14:33:59 1631 30

原创 Tomcat源码解析(二): Bootstrap和Catalina

Bootstrap是一个启动引导类,本身没有太多启动关闭细节的实现而是通过加载Catalina,对Catalina发号施令,调用start、stop等方法。

2024-02-29 21:42:52 1340 108

原创 关于字符集(彻底搞清楚一个中文占几个字节?)

不同字符编码在内存中的字符对应磁盘中的byte数组数值@Test// [65]byte[] bytes2 = "中".getBytes("GBK");byte[] bytes3 = "中".getBytes("UTF-8");注意: 在中文操作系统上,ANSI编码即为GBK;在英文操作系统上,ANSI编码即为ISO-8859-1。

2024-02-24 18:33:52 1267 114

原创 Java基础(二十六):Stream流及Optional类

Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列Stream和Collection集合的区别Collection是一种静态的内存数据结构,讲的是数据;主要面向内存,存储在内存中Stream是有关计算的,讲的是计算;面向CPU,通过CPU实现计算对于并行流,其在底层实现中,是沿用了Java7提供的fork/join分解合并框架进行实现fork根据cpu核数进行数据分块,join对各个fork进行合并。

2024-02-21 18:55:44 1342 38

原创 Java基础(二十五):Lambda表达式、方法引用、构造器引用

只要看起来没有歧义,只能仅有调用某个方法,传入某些参数,就可以简化为Lambda表达式或方法构造器引用。

2024-02-19 16:30:38 978 104

原创 Java基础(二十四):网络编程

回复一个彻底断开的报文。

2024-02-06 08:53:23 1043 1

原创 Tomcat源码解析(一): Tomcat整体架构

来确定请求是由哪个Wrapper容器里的。Pipeline-Valve是责任链模式。Tomcat支持的I/O模型。Tomcat支持的应用层协议。Pipeline接口。

2024-01-09 17:53:09 1906 132

原创 跨域的解决方式(java后端)

同源策略(Sameoriginpolicy)是浏览器最核心也最基本的安全功能一个页面发起的ajax请求,只能是与当前页域名相同的路径,这能有效的阻止跨站攻击所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号。

2023-12-14 13:54:41 1673 43

原创 JavaWeb三大组件(Servlet程序、Filter过滤器、Listener监听器)

概述Servlet (server applet) 是运行在服务端(tomcat)的Java小程序Servlet主要负责接收处理请求、协同调度功能以及响应数据Servlet是运行在服务端的,Servlet必须在WEB项目中开发且在Tomcat这样的服务容器中运行Servlet的请求和响应流程tomcat接收到请求后,会将请求报文的信息转换一个对象该对象中包含了请求中的所有信息(请求行、请求头、请求体)tomcat同时创建了一个对象,该对象用于承装要响应给客户端的信息。

2023-12-11 16:25:00 1016

原创 RocketMQ(四):重复消费、消息重试、死信消息的解决方案

因为 Message ID 有可能出现冲突(重复)的情况。创建user表结构,num_no字段设置为唯一索引。控制重试次数,重试几次后,直接记录到数据库等等。application.yml配置文件设置。所以用业务唯一标识作为幂等处理的关键依据。Redisson分布式锁配置。所有Consumer。监听死信队列处理消息。什么情况下会出现堆积。

2023-11-30 13:44:17 4117 38

原创 RocketMQ(三):集成SpringBoot

需要创建两个服务,消息生产服务和消息消费者服务。生产消息存在多个服务,消费则统一由一个服务处理。过滤模式有两种:正则表达式和sql92方式。keys从MessageExt对象中获取。获取带key和tag的消费者。

2023-11-17 10:20:15 551

原创 RocketMQ(二):原生API快速入门

Spring源码系列文章RocketMQ(一):基本概念和环境搭建RocketMQ(二):基础API及集成springbootpom.xml1、生产者发送消息dashboard客户端界面,查看主题界面可以看到刚刚创建的testTopic主题状态栏这里记录的是生产者发送的条数,所以这里没有变化执行结果:因为是异步,所以发送消息后,不论成功失败,继续往下走,执行“我先发送”之后消费发送成功,回调函数执行“发送成功”3、发送单向消息这种方式主要用在不关心发送结果的场景这种方式

2023-11-14 21:16:57 289 1

原创 RocketMQ(一):基本概念和环境搭建

RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务为什么要使用MQ?削峰限流:设置流程缓冲池,可以让后端系统按自身吞吐能力进行消费,不被冲垮异步:消息发送者可以发送一个消息而无需等待响应解耦:发送者和接收者不必了解对方,只需要确认消息,不必同时在线MQ的执行流程发送者把消息发给消息服务器[MQ]

2023-11-11 18:19:05 546

原创 Spring源码解析(十二):TransactionInterceptor事务拦截器

核心类作用:通过@Transactional注解指定的事务的属性,包括是否只读、超时、回滚等:事务的状态,这个状态分为很多方面,比如事务的运行状态(是否完成、是否被标记为rollbakOnly),事务的同步状态(这个事务是否开启了一个新的同步),还有事务是否设置了保存点。

2023-10-10 22:12:50 599

原创 Spring源码解析(十一):spring事务配置类源码

TransactionDefinition默认实现类DefaultTransactionDefinition。@EnableTransactionManagement与@EnableAspectJAutoProxy对比。AbstractTransactionManagementConfiguration抽象父类。ProxyTransactionManagementConfiguration核心配置类。PlatformTransactionManager的实现类。Spring中一共定义了7种事务的传播机制。

2023-10-08 17:02:44 204

原创 Spring源码解析(十):spring整合mybatis源码

通过sqlSession获取对应的代理对象代理对象执行sql完成数据库操作// 1.解析XML配置// 2.基于解析好的XML配置创建一个SqlSessionFactory// 3.通过SqlSessionFactory,创建一个SqlSession// 4.获取一个代理对象// 5.调用代理对象的方法System.out.println("代理对象查询结果:" + mapper.selectOne(1));根据@MapperScan注解扫描指定路径下接口。

2023-09-02 11:43:00 430

原创 gitee上传本地项目bug

🤮这个破bug不知道浪费了多长时间,以前没有记录,每次都忘记,这次记下来。

2023-08-30 15:10:20 957

原创 Spring源码解析(九):AOP源码之@Aspect所有相关注解解析

AOP是一种思想,它的实现主要有Spring AOP和AspectJspring AOP底层实现是jdk和cglib动态代理运行期织入借助了AspectJ的语法,即使用了@Aspect @Before @Pointcut等注解来实现AspectJ主要原理是用asm做字节码替换来达到AOP的目的,需要使用专门的编译器ajc编译期、编译期后、类加载期都可以织入AnnotationAwareAspectJAutoProxyCreator主要类图AOP的操作流程都在类中添加注解由@Import注解导入而来。

2023-08-29 10:51:59 315

原创 Spring源码解析(八):bean后置处理器CommonAnnotationBeanPostProcessor

查找bean的@Resource属性和@PostConstruct和@PreDestroy方法并缓存起来@Resource注解属性填充初始化前执行解析@PostConstruct注解的初始化方法销毁前执行解析@PreDestroy主键的销毁方法。

2023-08-08 22:55:55 1028

原创 Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor

过滤出可以作为构造注入的构造函数列表查找bean的@Autowired @Value属性方法并缓存起来@Autowired @Resource注解属性填充AutowiredAnnotationBeanPostProcessor构造函数autowiredAnnotationTypes 集合中保存了该类会处理的注解autowiredAnnotationTypes 中添加了三个注解@Autowired@Value、和通过反射得到的try {从多个Bean中,筛选出一个符合条件的Bean。

2023-08-06 22:01:37 1127

原创 Spring源码解析(六):bean工厂后置处理器ConfigurationClassPostProcessor

类图如下:ConfigurationClassPostProcessor是BeanDefinitionRegistryPostProcessor(bean定义后置处理器父类是BeanFactoryPostProcessor(bean工厂后置处理器根本作用就是解析注解给bean容器添加bean定义@Configuration,@Import,@ComponentScan,@Bean等注解因为有很多后置处理器,通过实现Ordered接口排序执行后置处理器重写的两个重要方法。

2023-08-03 14:06:49 424

原创 Spring源码解析(五):循环依赖

简单点说,就是A依赖了B,B依赖的A如果不处理,那么A创建时候需要属性填充B此时B还没有创建,那么去创建B,又需要属性填充A以此形成了死循环A依赖BB依赖A,自然排序,所以先实例化AgetBean(a),先从缓存中获取,没有,则需要去创建实例化A,创建一个对象工厂,可以通过getObje返回刚实例化的A对象,将对象工厂放入三级缓存A属性填充,需要给A中的b属性赋值,则需要getBean(b),先从缓存中获取,没有,则需要去创建。

2023-07-26 23:58:08 351

原创 Spring源码解析(四):单例bean的创建流程

接下来说下Spring源码解析(三):bean容器的刷新中最重要的实例化剩余的非懒加载bean进入beanFactory.preInstantiateSingletons();方法} // 创建beanDefinitionNames的副本beanNames用于后续的遍历,以允许init等方法注册新的bean定义 List < String > beanNames = new ArrayList < >(this . beanDefinitionNames);

2023-07-22 10:57:38 336

原创 Spring源码解析(三):bean容器刷新

上一讲Spring源码解析(二):bean容器的创建、默认后置处理器、扫描包路径bean主要是刷新上下文的准备工作进入refresh();方法,此方法定义在注解上下文父类AbstractApplicationContext注解配置上下文只是它的子类之一,还有xml上下和web上下文等// 1、刷新前预处理 prepareRefresh();

2023-07-21 21:40:36 382 2

贪吃蛇的java小程序

贪吃蛇的java小程序

2024-03-11

空空如也

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

TA关注的人

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