自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WormholeStack

不过分的追求时间的积累,更要有耐心的进行实践和复盘,坚持刻意练习。

  • 博客(207)
  • 收藏
  • 关注

原创 ✍RocketMQ源码阅读环境搭建

RocketMQ源码阅读环境搭建1.教程开始1.1 拉取代码源码地址:https://github.com/apache/rocketmq默认选择master分支执行git命令git clone https://github.com/apache/rocketmq.git使用IDEA导入项目下载依赖,耐心等待即可1.2准备配置文件本步需要修改源码中日志配置文件指定路径,避免直接修改源文件,选择新建目录用于存放日志配置文件。1) 在项目跟目录下面新建一个conf文件夹(用来存放日志配

2021-10-14 00:57:07 290

原创 MyBatis延迟加载原理剖析

????MyBatis延迟加载原理剖析1. 延迟加载的介绍及使用本文将针对MyBatis提供的延迟加载(懒加载)原理剖析。1.1 延迟加载是什么?简单的来说延迟加载就是,在需要用到数据的时候进行加载,不需要用到数据就不进行加载。假设数据库中涉及两张表,用户表AND订单表(一对多的关系),假设一个用户由很多订单,那么在查询用户的时候,需不需要当前用户关联的订单数据查询出来?通常来说查询用户信息的时候,肯定是需要用到用户订单的时候在查询为好,尤其是一对多的多表查询,通常都建议采用延迟加载,因为单标查

2021-09-19 19:48:32 2121

原创 深入浅出MyBatis缓存机制

1. 缓存的意义众所周知,和数据库打交道避免不了磁盘IO操作,那如果频繁的IO操作一定会对性能造成影响,所以减少与数据库的交互次数从而降低数据库压力进而提升查询效率是必要的。缓存是其中一种实现方式,简单的理解其实缓存就是内存中专门的一块区域,当从数据库中查询到一些数据将其放入缓存中,下次查询相同的数据时可以直接从缓存中获取数据即可,这样可减少了一步和数据库交互的过程。MyBatis提供了三级缓存机制,虽然MyBatis的缓存机制有些鸡肋,大部分开发人员多数情况都只会使用MyBatis默认缓存配置,又虽然

2021-08-27 01:11:31 774

原创 浅析MyBatis执行SQL流程

????浅析MyBatis执行SQL流程本文主要通过浅析MyBatis如何执行一个SQL语句(流程)为引,引出MyBatis的整体框架设计。作为MyBatis系列第一篇文章,必然先了解一下MyBatis的由来,所以在文章开始之前,我们来思考一个问题,MyBatis为什么诞生?1. 诞生一个轮子的诞生定是有其原因的,JDBC的诞生链接了程序和数据库,可以为多种关系数据库提供统一访问。 但是传统的JDBC方式存在很多缺点例如:数据库连接创建、释放频繁造成系统资源浪费,从⽽影响系统性能。Sql语句

2021-08-16 21:52:34 570 1

原创 你了解JDK SPI吗?

什么是JDK SPI 机制?SPI (Service Provider Interface) 是一种将服务接口与服务实现分离以达到解耦、大大提升了程序可扩展性的机制。引入服务提供者就是引入了spi接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔。当服务的提供者提供了一种接口的实现之后,需要在 Classpath 下的 META-INF/services/ 目录里创建一个以服务接口命名的文件,此文件记录了该 jar 包提供的服务接口的具体实现类。当某个应用引入了该 jar 包且需要使用该服务

2021-01-04 19:33:00 358 2

原创 《Spring源码分析》IOC的实现

由一个简单的例子引出本文代码如下:user.java@Datapublic class User { private String username; private int id;}userbean.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://ww

2020-12-22 00:36:47 297 1

原创 你了解在Java中如何自定义注解嘛?

由一个小例子引出今天的课题:校验用户信息,后端对接收的对象的信息例如用户名和密码做一个指定的校验。代码如下:User类指定用户名和密码设定要求@Data@NoArgsConstructor@AllArgsConstructorpublic class User { /** * 用户名 不能为空 长度不能大于6 */ private String username; /** * 密码 不能为空 长度不能低于5 大于13 */

2020-12-16 21:14:57 311

原创 《SpringBoot源码分析》@ConditionalOnBean

由示例引出本文的主角首先新建两个Pojo,分别是People和Company/** * @description: People * @Author MRyan * @Date 2020/12/5 14:20 * @Version 1.0 */@Data@ToString@NoArgsConstructor@AllArgsConstructorpublic class People { /** * 姓名 */ private String nam

2020-12-05 15:06:09 332

原创 逆向unity3d手机游戏

最近玩了一个游戏,发现获取买装备需要获取星星,获取星星需要赢得比赛,那我要是想买齐所有装备,我就要赢很多场比赛,等我凑齐了装备我也就不想玩了。。。所有我想上来就有星星!于是动手了!此方法不适用于作用加固的app。当然加固就脱壳呗也比较简单,那要逆向工程还是要确定思路。1.成果图:2.破解思路:直接利用apk导入AndroidKiller然后反编译签名认证,分析,判断当前的游戏Uni...

2020-12-04 17:51:42 2146 2

原创 《SpringBoot》如何配置多个数据源

起因:配置一个数据源我们知道可以在yml文件或者properties中编写配置,利用SpringBoot自动配置的特性完成绑定,但如果我们需要依赖一个以上的多个数据源这该怎么办呢?解决方案:不同的数据源配置要分开,避免混在一起,一定要注意正在操作的数据源是哪个。首先我们需要排除SpringBoot对数据源的自动配置,利用exclude属性将DataSourceAutoConfiguration,DataSourceTransactionManagerAutoConfiguration,JdbcTem

2020-12-04 16:52:56 815 2

原创 《SpringBoot源码分析》CommandLineRunner

CommandLineRunner有什么用在使用SpringBoot构建项目时,我们通常有一些预先数据的加载。那么SpringBoot提供了一个简单的方式来实现那就是CommandLineRunner。什么是CommandLineRunner?直奔主题:根据源码说明 我们可以通过实现CommandLineRunner接口并重写run方法来达到SpringBoot运行启动之后自动加载实现CommandLineRunner的类,同时我们可以定义多个类同时实现CommandLineRunner接口,通过@

2020-12-03 21:40:07 282

转载 Docker 安装 Redis

转载于菜鸟教程Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 的 NoSQL 数据库,并提供多种语言的 API。1、查看可用的 Redis 版本访问 Redis 镜像库地址: https://hub.docker.com/_/redis?tab=tags。可以通过 Sort by 查看其他版本的 Redis,默认是最新版本 redis:latest。你也可以在下拉列表中找到其他你想要的版本:此外,我们还可以用 docker s

2020-11-13 11:45:18 206

原创 Docker删除镜像踩坑Error response from daemon: conflict: unable to delete 68898be27496

起因:docker删除镜像报错原因:原因是这个镜像已经作为容器启动运行过,需要先删除容器,再删除镜像。解决方案:使用docker ps -a查看所有的容器删除container_id为 00984c2dded7 和d47aa40b48a7 的容器再删除镜像可成功删除...

2020-11-03 09:48:47 278

原创 初识RabbitMQ

1. 获取镜像查看MQ是否存在docker search rabbitmq:management指定版本,该版本包含了web控制页面docker pull rabbitmq:management2.运行镜像方式一:默认guest 用户,密码也是 guestdocker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management方式二:设置用户名和密码docker r

2020-11-02 10:58:30 369

原创 小招喵跑步(动态规划)

题目题目描述小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是:1.数轴上向前走一步,即n=n+12.数轴上向后走一步,即n=n-13.数轴上使劲跳跃到当前点的两倍,即n=2*n现在小招喵在原点,即n=0,它想去点x处,快帮小招喵算算最快的走法需要多少步?输入描述:小招喵想去的位置x输出描述:小招喵最少需要的步数示例1输入3输出3题目链接解题思路很明显是一道动态规划题目设dp[i]表示到达i点的最少步数最少就需要考虑两倍的走法如果当前位置

2020-08-23 10:52:58 639 1

原创 如何理解java代理模式?

需求假设现在有一个需求:在项目现有所有类的方法前后打印日志。你如何在不修改已有代码的前提下,如何完成这个需求?直切主题那这个时候我们可以使用动态代理要理解动态代理首先要理解代理模式什么是代理模式?有一个打印机的类public class Printer { public void print(){ System.out.println("打印!"); }}我想在打印之前先记录一下日志怎么做?最简单的方法:在打印的功能前面直接加上记录日志的功能。publ

2020-08-16 10:53:15 403

原创 localstorage用法

一、什么是localStorage、sessionStorage在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中localStorage会有所不同。在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别,

2020-08-12 11:38:05 665 1

原创 springboot实现热部署

IDEA自动make配置目的是开启IDEA自动make功能File->Setting->Build,Execution,Deployment->Complier,勾选Build Projectautomatically 快捷键:Ctrl+Shift+A,然后输入Registry,找到compiler.automake.allow.when.app.running并勾选SpringBoot maven配置 <dependency> ..

2020-08-12 11:33:16 201

原创 远程连接服务器mysql数据库

登录服务器,登陆MySQL数据库命令如下:mysql -u root -p pwd;查询MySQL数据库是否允许远程ip访问,命令如下:use mysql;select host, user from user;查询结果为127.0.0.1或者localhost或者当前服务器域名,则表示不允许远程连接。开启远程访问操作。命令如下:GRANT ALL PRIVILEGES ON . TO ‘root’@’%'IDENTIFIED BY ‘*****’ WITH GRANT OPTIO..

2020-08-12 11:32:23 395

原创 Thymeleaf初入坑(一)

1.什么是ThymeleafThymeleaf是⾯向Web和独⽴环境的现代服务器端Java模板引擎,能够处 理HTML,XML,JavaScript,CSS甚⾄纯⽂本。Thymeleaf旨在提供⼀个优雅的、⾼度可维护的创建模板的⽅式。 为了实 现这⼀⽬标,Thymeleaf建⽴在⾃然模板的概念上,将其逻辑注⼊到模板 ⽂件中,不会影响模板设计原型。 这改善了设计的沟通,弥合了设计和 开发团队之间的差距。Thymeleaf从设计之初就遵循Web标准------特别是HTML5标准 ,如果需 要,Thyme

2020-08-12 11:31:09 216

原创 撸一个Springboot自动登录功能

本文结合Shiro手撸一个自动登录功能我们知道Cokkie都是存在本地的,而Session是存在服务器上的。我们创建了普通对话Session它的生命周期只存在于浏览器开启关闭期间。那我们难道需要每次进网址都需要登录?那也太麻烦了,虽然Shiro框架有记住我功能,但是发散思维自己动手!纯手撸,方法粗糙,望大佬指教。自动登录功能流程思路:1.(LoginController)登陆过程中 判断数据库中该登录用户是否有token,如果没有(表示新用户)则在服务器数据库中生成token subj

2020-08-12 11:29:54 1161

原创 IDEA中配置MySQL出现Server returns invalid timezone问题解决方法

原因:首先,出现该问题的原因是MySQL驱动jar中的默认时区是UTC。UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,领先UTC八个小时。因为时区不一致,所以提示Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTimezone’ property manually解决方案:...

2020-08-10 15:39:54 911

原创 IDEA连接mysql报错!Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ prope

在用idea连接mysql数据库时报错**提示:**服务器返回无效时区。进入“高级”选项卡,手动设置“serverTimezone”属性。解决方案:进入命令窗口(Win + R),连接数据库 mysql -hlocalhost -uroot -p,回车,输入密码,回车,如图:继续输入 show variables like’%time_zone’; (注意不要漏掉后面的分号),回车,如图:显示 SYSTEM 就是没有设置时区啦。现在我们来设置时区。输入set global time

2020-08-08 16:04:43 193

原创 《SpringBoot源码分析》 Context初始化流程

不管是XML配置的Context,还是Spring Boot的Context,还是Web服务中的Context,创建后都会调用AbstractApplicationContext类的refresh()方法。定位到AbstractApplicationContext下的refresh()方法,开始分析。整体流程如下: @Override public void refresh() throws BeansException, IllegalStateException { //1 synch

2020-08-02 11:39:09 1628 1

原创 你真的了解String的创建吗?

起因在文章的开始之前,有一个问题需要思考。String s = "MRyan";String s = new String("MRyan");以上是String的两种赋值方式,它们有什么区别吗?它们在内存中有几个实例?存储在哪个区域里?实例存储在哪里?字面量存储在哪里?想要回答这些问题,需要对JVM有一定的了解狂补JVM基础知识都知道JVM的内存结构包括堆,虚拟机栈,方法区,程序计数器,本地方法栈。其中和本文章有关系的1. 堆:作为整个JVM内存结构中占用最大的一块空间,存放对象实例和

2020-07-29 17:23:01 2050

原创 【剑指 Offer 57 - II】和为s的连续正数序列 (滑动窗口)

题目题目连接输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]限制:1 <= target <= 10^5解题思路1没啥技巧纯暴力但超时class Solution { public

2020-07-28 17:38:49 2153

原创 【剑指 Offer 57】 和为s的两个数字

题目题目链接输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]限制:1 <= nums.length <= 10^51 <= nums[i] &lt

2020-07-28 13:16:04 2172

原创 【剑指 Offer 53 - I】 在排序数组中查找数字 I

题目题目链接统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制:0 <= 数组长度 <= 50000解题思路二分查找缩减范围利用二分的思想,排除数组中左侧不包含给定数字的部分,再另一部分中遍历查找输出出现次数代码class Solution { public int search

2020-07-27 16:43:37 1822

原创 《SpringBoot源码分析》启动流程

源码分析在SpringApplication.run(SystemmanageApplication.class, args) 入口打个断点,debug进去。定位到public ConfigurableApplicationContext run(String… args)方法,开始分析吧public ConfigurableApplicationContext run(String... args) { // 创建并启动计时监控类 StopWatch stopWatch = n

2020-07-27 08:44:57 2396

转载 @Component 和 @Bean 的区别

转载于:链接两者的联系和区别@Component 和 @Bean 是两种使用注解来定义bean的方式。@Component(和@Service和@Repository)用于自动检测和使用类路径扫描自动配置bean。注释类和bean之间存在隐式的一对一映射(即每个类一个bean)。这种方法对需要进行逻辑处理的控制非常有限,因为它纯粹是声明性的。@Bean用于显式声明单个bean,而不是让Spring像上面那样自动执行它。它将bean的声明与类定义分离,并允许您精确地创建和配置bean。@Compo

2020-07-26 21:15:36 1359

原创 【剑指 Offer 48】最长不含重复字符的子字符串

题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子

2020-07-26 15:26:31 1323

原创 【剑指 Offer 47】礼物的最大价值 (动态规划)

题目题目链接在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物提示:0 < grid.length <= 2000 < g

2020-07-26 12:23:49 2191 1

原创 【剑指 Offer 46】 把数字翻译成字符串 (动态规划)

题目题目链接给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"提示:0 <= num < 231代码动态规划思想首先我们存在num=t(1)

2020-07-25 15:02:43 1185

原创 【剑指 Offer 45】 把数组排成最小的数

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459"提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0解题思路其实就是排序**思路如下:**若能满足题目要输出所有元素拼接后的最小值,可以将其

2020-07-25 11:28:55 2123

原创 【剑指 Offer 39】 数组中出现次数超过一半的数字

题目题目链接数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000解题思路1利用哈希表存储元素以及元素出现的次数,key为元素,value为元素出现的次数。如果元素出现的次数大约数组长度的一半 则输出。代码class Solution { public int majority

2020-07-24 11:40:26 779

原创 【剑指 Offer 38】字符串的排列

题目题目链接输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]限制:1 <= s 的长度 <= 8解题思路全排列问题回溯思想,考虑到如果输入字符串中包含重复元素,要求结果中不能有重复元素,所以这里用到了set集合去重。为了方便理解,这里抽象成递归树。代码class Solution { pub

2020-07-24 10:27:28 1533

原创 【剑指 Offer 35】复杂链表的复制

题目题目链接请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例 2:输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]示例 3:输入

2020-07-23 17:18:53 1645

原创 【剑指 Offer 34】二叉树中和为某一值的路径 (回溯)

题目题目链接输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,11,2]

2020-07-23 15:16:01 1733

原创 【剑指 Offer 33】二叉搜索树的后序遍历序列

题目题目链接输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= 1000解题思路后序遍历倒序: [ 根节点 -> 右子树 ->左子树

2020-07-23 13:26:40 1472

原创 【剑指 Offer 32 - I II III】从上到下打印二叉树 I II III

题目剑指 Offer 32 - I. 从上到下打印二叉树 剑指 Offer 32 - II. 从上到下打印二叉树 II剑指 Offer 32 - III. 从上到下打印二叉树 III解题思路三道题思路相同,只不过处理格式不同准备一个队列,将根节点入栈,将根节点弹出的同时记录根节点的值并且将根节点的左右子树入队,以此类推,直到队列中无任何元素代码剑指 Offer 32 - I. 从上到下打印二叉树 class Solution { private Queue<TreeNode

2020-07-22 17:31:43 501

空空如也

空空如也

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

TA关注的人

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