自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java Agent实例:方法监控

本篇文章主要讲述了一个Java Agent的简单案例,结合Javassist实现简单的方法监控,感兴趣的小伙伴可以来看看哦!

2022-02-16 19:47:37 4056 1

原创 字节码插桩之Java Agent

本文主要讲述了Java Agent的一些基本知识和简单原理,并通过一些实际的案例进行实践,帮助大家加深对Java Agent的认识,后续还会出相关案例,敬请期待哦!

2022-02-14 09:06:01 2132

原创 字节码增强之Javassist

本文主要讲述了Javassist字节码编辑技术,想要了解的小伙伴可以参考下本篇文章!

2022-02-12 10:31:42 1841

原创 MySQL可重复读-问题实践

MySQL可重复读之幻读问题MySQL事务存储引擎InnoDB的默认隔离级别为可重复读,在该隔离级别下,可以很大程度上避免幻读的问题,完全避免脏读和不可重复读问题,接下来通过实际的测试看看这些场景是否真的能够被完全避免模拟均基于下表:CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', `username` varchar(20) NOT NULL COMMENT '用户名', `password` v

2021-08-23 11:45:46 1427

原创 一文带你了解Java8之Stream

Java8 Stream流式编程简介Java8中stream是用于对集合迭代器的增强,使之能供完成更高效的聚合操作(例如过滤、排序、统计分组等)或者大批量数据操作。此外,stream与lambda表达式结合后编码效率将会大大提高,并且可以提高可读性。首先来看一个简单的场景,准备工作如下,编写了一个person类:public class Person { /** * 姓 */ private String lastname; /** * 名

2021-06-21 10:20:17 3028 21

转载 一文带你掌握Spring AOP的底层实现

Spring AOP底层实现spring aop中的joinpoint前面讲过多种类型的joinpoint,如构造方法调用、字段的设置即获取、方法调用、方法执行等,但是在spring aop中之实现了方法级别的joinpoint,确切来说是只支持方法执行类型的joinpoint。虽然spring aop仅提供方法拦截,但是实际开发过程中,这已经可以满足80%的开发需求了。如果要使用超出spring aop之外的功能,可以借助其他aop实现产品,如aspectjspring aop中的pointcut

2021-06-17 16:48:51 771 6

原创 一文带你认识Spring AOP

Spring AOP简介AOP(Aspect-Oriented Programming:面向切面编程)是对OOP(Object-Oriented Programming:面向对象编程)的补充和完善。OOP引入封装、继承和多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。封装就要求将功能分散到不同的对象中去,这在软件设置中往往称之为职责分配,实际上也就是说,让不同的类设计不同的方法,这样代码就分散到一个个类中去了。这样的设计降低了代码的复杂度,使类可重用。但是在分散代码的同时,也增加了代码

2021-06-16 09:01:09 570 23

原创 Redis分布式锁的简单实现

Redis分布式锁随着业务发展的需要,原来单机部署的系统演化成分布式集群系统之后,由于分布式系统多线程、多进程并且分布在不同的机器上,使得原来单机部署情况下的并发控制策略失效,单纯的Java API并不能提供分布式锁的能力,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。也就是说,当我们使用分布式锁时,该锁多分布式系统内的所有应用都有效。分布式锁的主流实现方案有多种,包括基于数据库实现的分布式锁、基于缓存(如redis)实现(性能最高)、基于zookeep

2021-06-10 16:07:45 372 16

原创 深入理解ThreadPoolExecutor第三弹

从源头解析ThreadPoolExecutor第三弹—属性及execute方法详解首先我们看看ThreadPoolExecutor都有哪些属性:ctl属性是ThreadPoolExecutor中出现的第一个属性,所以我们首先来看看ctl属性的作用。ctl属性ctl是线程池中的重要标识,它主要有两个作用:线程池的运行状态线程池中工作线程数这里为什么要用一个变量代表线程池中两个重要标识呢,我们可以从如下两点考虑:首先,我们需要考虑的是多线程中线程安全的问题。在多线程环境中,Java中主要

2021-06-07 09:03:39 405 8

原创 一文带你掌握Java开发利器:Maven

Maven如果作为一个Java程序员,那么在日常的开发过程中,maven是很常见的项目构建工具。maven可以极大的提高我们的开发效率,帮助我们简化开发过程中一些解决依赖和项目部署的相关问题,所以学习掌握maven的相关知识是非常有必要的。本文从入门安装开始,逐步深入讲解maven的相关知识。1、安装maven首先我们需要准备好安装包,这里推荐在官网下载:maven官网下载地址我这里下载的是3.8.1版本的maven,不同版本的maven配置过程基本是一样的。1.1 Windows安装首先将

2021-06-03 15:17:53 2454 50

原创 深入理解ThreadPoolExecutor第二弹

从源头解析ThreadPoolExecutor第二弹—ThreadPoolExecutor的内部类ThreadPoolExecutor主要包括如下内部类:其中AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy表示任务的拒绝策略,当线程池的线程数量达到最大值并且阻塞队列已满时,根据这些不同的策略对新提交的任务进行不同的处理。它们都实现了RejectedExecutionHandler接口。而Worker代表我们执行的任务,我们提

2021-05-31 10:12:05 371 23

原创 深入理解ThreadPoolExecutor第一弹

从源头解析ThreadPoolExecutor第一弹—Executor&ExecutorService&AbstractExecutorService首先我们来看看Thread PoolExecutor的继承关系:从上图中可以看出,ThreadPoolExecutor继承自AbstractExecutorService,而AbstractExecutorService又实现了ExecutorService接口,ExecutorService接口继承自Executor。那么我们今天先来

2021-05-28 09:03:34 352 4

原创 Jenkins和Gitee自动化部署SpringBoot项目

Centos使用Jenkins和Gitee自动化部署Spring Boot项目本教程是在腾讯云上面通过jenkins.war包进行Jenkins的部署,没有采用docker和yum的方式。此外,本项目是在云服务器本地进行自动构建,所以就没有配置publish over ssh环境准备首先我们需要确保已经安装了jdk、maven和git环境。因为Jenkins需要使用git从gitee上面拉取项目源码,然后通过maven进行构建,然后需要通过jdk运行构建好的项目,所以这里需要这些环境jdk安装安装

2021-05-26 21:47:17 1762 26

原创 浅析JUC-CountDownLatch

JUC-CountDownLatch详解CountDownLatch是通过AQS实现的同步器,与ReentrantLock不同的是,CountDownLatch实现的是共享式获取锁的方法,而非是独占式的。也就是说不同的线程都可以调用CountDownLatch方法获取锁,或者对锁进行释放CountDownLatch源码下面我们来看看其源码:/*CountCDownLatch是一种同步辅助工具,允许一个或者多个线程等待一组在其他线程中执行的操作完成CountDownLatch在初始化时会指定一个

2021-05-24 19:55:35 329

原创 Java如何停止一个线程

Java如何停止一个线程在Java中,停止一个正在运行的线程,我们可以通过如下方法实现:设置一个volatile类型的变量,通过判断变量的值来确定run方法是否运行完成正常退出通过interrupt()方法来通知,给线程打上一个终止的标志,但是具体的停止逻辑需要在线程内部实现此外还有一种方法是调用stop()方法来停止线程,但是这个方法不安全:它会释放该线程持有的所有锁,一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有锁突然释放,

2021-05-20 19:34:59 5304 9

原创 Java之sleep和wait

Java之sleep和waitsleep和wait方法都是native关键字修饰的方法,这说明这两个方法是原生函数,也就是由C/C++实现的,那么我们就暂时不关心它的具体实现了。sleep方法是Thread类中的方法,而wait方法是Object中的方法,那么我们首先看看wait方法。Object#wait()从Object源码中,我们可以发现,wait有三个重载方法,分别是无参的wait方法,带有long和int类型参数的的wait方法,以及带有long类型参数的方法。其实前两个方法最终都是调用了

2021-05-18 13:09:56 6012 3

原创 浅析Java-SPI机制

Java SPI机制SPI全称为Service Provider Interface(服务提供接口),是JDK内置的一种服务发现机制,是一种将服务接口与具体实现分离以达到解耦,大大提升了程序可扩展性的机制,引入服务提供者就是引入了spi接口的实现者,通过本地的注册发现获取到具体的实现类。Java SPI实际上就是"基于接口的编程+策略模式+配置文件"组合实现的动态加载机制。系统设计之初为了各个功能模块之间解耦,一般都是基于接口编程,模块之间不对实现类进行硬编码,一旦代码涉及到具体实现类的耦合,就违反了

2021-05-16 21:26:43 522

原创 AQS原理初探

AQS原理初探AQS全称为AbstractQueuedSynchronizer,如果直接按名字翻译的话就是抽象队列式同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类的实现都依赖于它,如ReentrantLock(可重入锁)、Semaphore(信号量)等等。它是构建锁或者其他同步组件的基础框架。可重入锁这里解释一下可重入锁:可重入锁就是如果某个线程已经获得某个锁,可以再次获取该锁而不会导致死锁。ReentrantLock以及synchronized都是可重入锁,其中Reentrant

2021-05-11 12:37:11 816 2

原创 浅析ReentrantLock

浅析JUC-ReentrantLock首先,我们来看看ReentrantLock的继承关系(通过idea查看):从上面的类图中,我们可以发现,ReentrantLock实现了Lock接口,通过Lock接口实现了更多可扩展性的锁操作,它有更加灵活的结构,并且支持Condition锁。ReentrantLock的内部类FairSync和NonfairSync继承自另一个内部类Sync,而Sync继承自大名鼎鼎的AQS,站在巨人的肩膀上实现了这一系列的锁机制。Lock首先我们来看看Lock接口。/*

2021-05-10 08:52:51 445 4

原创 浅析Redis事务

Redis事务Redis事务是一个单独的隔离操作:事务的所有命令都回序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送来的命令请求打断。Redis事务主要作用就是串联多个命令,防止其他命令插队。事务相关命令Redis中与事务相关的命令有如下三种:multi:开启事务,会将开启事务后的命令按顺序加入到队列中(类似于MySQL的start transaction),入队阶段exec:执行事务,会按照顺序执行事务队列中存储的命令(类似于MySQL的commit),执行阶段discard:丢

2021-05-09 14:09:52 333

原创 浅析Spring Boot请求映射原理

浅析Spring Boot请求映射原理Spring Boot的底层还是Spring MVC,那么Spring Boot的请求映射就与Spring MVC是相同的,那就是根据DispatcherServlet完成了请求映射的功能。但是我们没有手动去配置DispatcherServlet对应的配置项,那么Spring Boot是如何加载的DispatcherServlet呢,这个答案就是之前讲解的Spring Boot自动装配。那么首先来看看自动装配的DispatcherServlet测试程序@Rest

2021-05-03 20:58:48 1121

原创 Spring Boot自动装配原理初探

Spring Boot自动装配原理初探Spring Boot自动装配主要是通过注解实现的,我们直到,Spring Boot启动类会有这样一个注解:@SpringBootApplication。在这个注解里面,除了Java的元注解以外,还有三个spring自定义的注解,分别是:@SpringBootConfiguration:标识该类是spring的配置类,是对@Configuration注解的包装@EnableAutoConfiguration:这是自动装配的关键注解,本文主要就是介绍这个注解@C

2021-05-01 21:31:42 329

原创 Spring源码系列(四):AbstractApplicationContext

Spring源码系列四:AbstractApplicationContext首先我们看看AbstractApplicationContext的继承体系:从上图来看,AbstractApplicationContext实现了ConfigurableApplication接口,而ConfigurationApplication接口继承自ApplicationContext、Lifecycle和Closeable,ApplicationContext又扩展了BeanFactory的功能,归根到底这些都是在帮

2021-04-24 10:41:41 2047

原创 SpringBoot-Jar包启动流程

Spring Boot Jar包启动流程启动流程概览首先,我们通过java -jar命令启动jar包,此时调用Launcher$AppClassLoader类加载器加载,此时涉及了MANIFEST.MF中Main-Class对应的属性然后构建Spring Boot加载器,通过调用LaunchedURLClassLoader类加载器加载jar包中/BOOT-INF/classes/和/BOOT-INF/lib/*.jar文件基于反射调用应用程序的启动方法,此时涉及了MANIFEST.MF中

2021-04-20 20:19:24 2900

原创 Java动态代理

Java动态代理代理模式我们生活中充满了代理的例子:例如房产中介,卖房者将房子委托给房产中介,买房者买房去房产中介而不是直接去寻找卖房者,这里面房产中介就是代理。再比如,现在都流行点外卖,在点外卖的场景中,商户将自己委托给外卖平台,而客户在这个外卖平台直接下单,省去了实地寻找商户的过程,这里外卖平台就是代理通过上述生活中的实际例子,相信我们都知道代理是什么了,代理模式是一种结构型设计模式,让你能够提供对象的替代品或其占位符,代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。

2021-04-18 11:20:15 249

原创 Spring源码系列:bean生命周期及循环依赖

1、Spring中bean的创建流程bean创建的简易流程如下所示:首先调用createBeanInstance方法进行bean的实例化然后调用populateBean进行属性的填充接着调用initializeBean进行后置处理最后调用getSingleton方法添加到单例池中以上createBeanInstance、populateBean和initializeBean均属于类org.springframework.beans.factory.support.AbstractAutowi

2021-04-14 11:22:41 369

原创 spring源码系列(三):FactoryBean

1、FactoryBean源码详解首先,我们来看看FactoryBean的源码:package org.springframework.beans.factory;/*由BeanFactory中的某些对象实现的接口,BeanFactory是Spring IOC容器的核心;如果bean实现了这个接口,它将被用作对象的工厂来公开,而不是直接作为bean实例来公开实现了该接口的bean不能被作为一个普通的bean使用。FactoryBean以bean的类型定义,但是它暴露的bean引用始终是由它通过

2021-04-13 09:09:07 397

原创 Spring源码系列(二):BeanDefinition对象

Spring源码系列二:BeanDefinition对象BeanDefinition可以看作是一个bean在Spring中的描述。首先大体介绍BeanDefinition这个对象,它描述了bean的一些基本信息,包括:bean的class名、作用域(单例、原型)、懒加载、FactoryBean、构造函数、属性值、描述以及bean的来源,spring会根据这些信息来实例化bean。BeanDefinition对象在org.springframework.beans.factory.config包下,我们

2021-04-11 20:11:52 729

原创 Spring源码系列(一):BeanFactory

Spring中的BeanFactory和ApplicationContextSpring通过配置文件或者注解描述Bean和Bean之间的依赖关系,利用Java的反射功能实例化Bean,并建立Bean之间的依赖关系。本文主要讲解BeanFactory和ApplicationContext,其中:BeanFactory是Spring框架最核心的接口,它提供了IOC的基本配置,ApplicationContext建立在BeanFactory的基础上,提供了更多面向应用的功能,它支持了国际化的信息,框架的事件

2021-04-08 19:20:28 547

原创 MyBatis原理初探

MyBatis原理初探SqlSessionFactoryBuilder对象每一个mybatis的应用程序都是SqlSessionFactoryBuilder,它是根据传入的对象创建SqlSessionFactory实例。在spring项目中,我们通常使用xml配置文件,通过xml文件创建Configuration对象,然后通过重载选取合适的build方法,进而创建SqlSessionFactory对象。此外,我们还可以通过Properties或者String对象创建SqlSessionFactory

2021-03-15 09:10:34 559

原创 阿里云Centos7 RocketMQ安装教程

下载RocketMQRocketMQ官网下载bin压缩包,source压缩包是源码,这里我们直接使用bin进行安装安装上传至服务器将rocketmq-all-4.8.0-bin-release.zip上传到自己的服务器,我这里是上传到了/usr/local目录下(可以上传到自定义的其他目录下),使用的上传工具是xftp解压安装包使用如下命令对安装包进行解压,前提是你必须在rocketmq压缩包所在的目录下运行此命令,以下命令都是在rocketmq压缩包所在的目录下运行的unzip rock

2021-02-25 19:58:03 483

原创 leetcode:442.数组中重复的数据

题目描述:给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]解题思路:桶计数(简单但不符合题意)使用int数组对nums数组中的元素进行计数,然后遍历这个数组,将出现次数为2的元素加入结果list中即可标记法由于题目给定nums[i]的范围是[1,n],且元素最多出现两次

2021-02-15 21:37:33 439 2

原创 Windows搭建Typora + Gitee + PicGo图床

Windows搭建Typora + Gitee + PicGo图床Gitee设置首先需要获得私人令牌,这是至关重要的一步。在Gitee首页点击头像打开设置->私人令牌->生成新令牌创建完新令牌以后,我们需要记住令牌的token,这个token只显示一次,所以一定要注意保存接下来就是创建新的仓库,设置仓库名称,填写仓库介绍,选择公开,并且选择MIT开源许可证,一切都选择完成以后直接点击创建即可,到此Gitee已经算是设置成功。接下来下载PicGoPicGo配置下载地址:

2021-02-03 23:10:25 309 1

原创 2020 Zookeeper单机版安装教程

1、下载安装包下载地址:http://archive.apache.org/dist/zookeeper/下载bin.tar.gz文件2、上传至服务器我在usr目录下创建了存放zookeeper的文件夹,将压缩包上传至创建的目录下即可3、解压缩运行如下命令解压缩即可tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz进入conf目录下,运行如下命令创建配置文件:cp zoo_sample.cfg zoo.cfg首先创建存储日志和数据的目录,我直接在

2021-01-15 10:46:55 257 1

原创 docker安装MySQL并实现主从复制

docker安装MySQL1、首先在docker搜索mysqldocker search mysql2、docker仓库拉取mysql8.0docker pull mysql:8.0 //拉取8.0版本的MySQLdocker pull mysql //默认拉取最新版本的MySQL备注:由于我之前拉取过mysql,所以这里显示的是Already exists3、查看本地的镜像是否下载成功docker images mysql:8.04、运行mysql:8.0容器docke

2021-01-14 10:41:09 976 1

原创 设计模式之工厂模式

设计模式之工厂模式工厂模式案例工人制造汽车的过程中需要组装汽车的零部件,然后生产出来汽车,不同品牌的汽车组装过程大同小异,是不是可以类比软件开发过程呢。工人组装汽车的过程涉及三个对象,分别是工人、机器以及汽车品牌。工人类似于Client,机器就相当于工厂,负责组装汽车零部件生产汽车,不同品牌的汽车就是产品。那么对应的类图就如下所示。所有汽车的总称public interface Car { public void assemble();}public class Mercedes i

2020-12-30 09:22:52 352

原创 设计模式之单例模式

设计模式之单例模式单例模式定义单例模式是一个比较简单的模式,定义如下:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己使用new Singleton()),单例模式的通用代码(代码1)如下:public class Singleton { private static final Singleton singleton = new

2020-12-28 21:19:49 339

原创 Redis缓存穿透,击穿以及雪崩详解

Redis缓存穿透什么是缓存穿透缓存中存储的一定是数据源中存在的数据,只有数据源中存在某个数据,在初次请求之后我们才会把它放在缓存中,等待下一次请求时直接返回缓存的数据;如果数据源中不存在这个数据,那么我们也就不会对其进行缓存。对此,也就出现了缓存穿透问题。缓存穿透,指的是大量并发请求查询的都是数据库中一定不存在的数据,那么对应的缓存中也一定不存在该数据,所以这些并发请求都回落到数据库中,进而有可能会压垮数据库,引发宕机。黑客可以利用这种漏洞去攻击某个网站解决办法在实际应用中有很多解决缓存穿透办法

2020-12-22 18:21:54 321

原创 2020.11 centos7 Elasticsearch安装教程

Elasticsearch安装教程我这里使用的是rpm安装包,省去了一些麻烦的配置下载rpm安装包首先建议使用rpm安装包进行安装,这样只修改一些简单的配置然后即可启动,无需新建用户下载地址:elasticsearch官网下载地址下载完成以后上传至云服务器,自定义上传目录rpm安装Elasticsearch使用如下命令安装elasticsearchrpm -ivh elasticsearch-7.10.0-x86_64.rpm安装完成以后需要修改一些配置,使用如下命令进行编辑vim /

2020-11-19 20:01:11 289 1

原创 Spring Framework Core IOC

CoreIoC Container依赖注入的方式如下:通过构造函数参数通过工厂方法的参数从构造或者工厂方法返回的对象实例上设置的属性这个过程通过直接使用类的构造或者类似服务定位器模式的机制来控制其依赖项的实力化或者位置,它把bean的控制交由程序来做,不再由程序员自己去控制,所以称为控制反转。Spring Framework的IOC容器的基础就在org.springframework.beans和org.springframework.context包下。BeanFactory提供了高级

2020-11-09 20:36:19 542

空空如也

空空如也

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

TA关注的人

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