自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(97)
  • 资源 (4)
  • 收藏
  • 关注

原创 guns shiro 升级

背景之前使用guns做的项目中,由于使用的是shiro,并且使用的是它默认的AES加密公共密钥,所以,存在安全性问题。解决首先,需要先对shiro的版本进行升级,如果之前使用的是shiro 1.2.4之前的版本,那么会存在反序列化安全性问题。在1.2.4版本之前,shiro问题如下。当浏览器发送remember Me Cookie的请求时,服务端的流程如下。读取cookie -> base64解码 -> AES解密 -> 反序列化。在1.2.4版本之前,这个AES加密的密钥是

2021-11-12 12:33:44 808

原创 ForkJoin框架

1.简介我们知道,在我们使用多线程时,为了提高并发性,我们可以使用线程池来实现功能;但是,其实Java还提供了一个ForkJoin框架,这个框架使用归并的思想来实现;一般在学习这个框架的时候,都是使用数组中各元素相加来模拟这个框架;本文也将使用这个方法来使用这个框架;2.代码由于,我们是需要使用归并的思路来实现各数相加;那么,我们首先要实现任务,然后,将任务设置好阈值public class SumTask extends RecursiveTask<Long> { // 阈值

2021-06-06 22:35:08 140 1

原创 clone相关

1.学习目标1.能够理解clone方法的由来2.能够使用clone方法创建对象3.能够理解克隆对象和原对象的关系4.能够理解clone方法创建对象与反射和new关键字创建对象的不同5.能够理解浅复制和深复制的含义6.能够探寻对象的复制必须实现Cloneable接口的底层源码1.1 克隆方法的由来问题1:什么是clone方法创建并返回此对象的一个副本 – 按照原对象,创建一个新对象(复制原对象的内容)问题2:已经存在new 关键字和反射技术都可以创建对象,为什么还有一个Object的clo

2021-05-19 19:48:39 126 2

原创 Debug 调试相关

1. 各功能结构图简单说一下,部分内容3. Debug 窗口:访问请求到达第一个断点后,会自动激活Debug窗口;4. 调试按钮:一共有8个按钮,调试的主要功能就对应着这几个按钮,鼠标悬停在按钮上可以查看对应的快捷键5. 服务按钮:可以在这里关闭/启动服务,设置断点等。6. 方法调用栈:这里显示了该线程调试所经过的所有方法,勾选右上角的[Show All Frames]按钮,就不会显示其他类库的方法了,否则这里会有一大堆的方法。7. Variables:在变量区可以查看当前断点之前的当前方法内

2021-05-16 19:39:07 126

原创 将公钥放到一个子项目中,其他项目需要获取公钥的时候,去该项目中获取

子项目提供接口返回公钥内容@RestControllerpublic class TestController { @RequestMapping("/test") public String test() { return "-----BEGIN PUBLIC KEY-----\n" + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhIMk0muSD/UbVcvCrwPp\n" +

2021-04-26 10:57:07 124

原创 Spring cloud + Spring security + jwt 使用权限管理

演示项目结构如下:首先:先进行用户登陆,获取token其次,根据用户的token 来访问相应的接口码云代码系统更新由于,当前的Spring boot 已经是2.4.4版本了,那么,对系统中版本进行了更新,由于 Spring Cloud 和 Spring Boot是相匹配的,故也需要一起进行更新;然后,其他的Maven也进行了简单的更新;...

2021-04-19 14:32:06 364

原创 有意思的 sql训练

sql在使用mysql的过程中,sql是基本功,在写sql的时候,一定要提高自己的速度;sql 训练一 :海康笔试题表结构如下:student (sid, sname, age, gender) : 学生表 (学生id, 学生名,年龄,性别)teacher (tid, tname): 教师表 (教师id, 教师名)course (cid, cname, tid) : 课堂信息表(课程id, 课程名,教师id)student_course_score (sid, cid, score): 学生课

2021-04-18 18:38:53 1694

原创 Mysql binlog查看相关问题

mysql 查看日志只查看第一个binlog 文件查看最新的binlog 文件名可以去你自己的数据库文件中查找: show binlog events in 'DESKTOP-0AIBBVF-bin.000125';结果如下:每更新一句语句,都会有记录; 这时候,发现看不懂啊;原因如下: 在mysql 8 的时候,升级为row 复制了不是基于(statement) sql语句的复制;statement:优点:记录每一条修改数据的sql,大大减少了binlog 日志量,节约了IO 缺点:

2021-03-11 12:47:09 100

原创 SQL topN相关问题

sql topN相关比如说:不同班级同学成绩的前三名同学;先来一个前置知识的介绍;这个是一个班级的成绩表,表名为study, 班级字段为class 姓名字段为name 成绩字段为score;首先,难点在于每个课程前3高成绩。前三高的成绩,意味着我们需要对成绩进行排名。这个时候,就需要使用到窗口函数了。select *, rank() over (order by score desc) as ranking, dense_rank() over (order by score desc

2021-03-10 14:16:31 143 2

原创 Runnable实现参数传递

大家都知道Runnable()是无法传参数的,但是,有时候,我们提交任务的时候,是需要传递参数的,所以,为了解决这个问题,有以下的方法;这是,一个参数传递的设置接口,里面有一个设置参数的方法public interface MyRunnable extends Runnable { public MyRunnable setParam(String param);} public static void main(String[] args) { MyRunnabl

2021-03-08 15:37:40 4577

原创 Spring

Spring观察者模式 :在spring容器中,有一系列的监听器,用来完成:在不同的阶段做不同的处理工作;Spring 的整体架构图:IOC 和 AOC联系IOC底层实现的机制是通过反射的方式来实现;AOC底层实现是通过动态代理;IOC 控制反转,里面有一个容器;放我们的对象Bean;这个Bean是放在Map里面的;这个Bean 就是通过反射来创建的;我们可以模拟@Autowired这个注解public class UserController { private UserServic

2021-01-26 16:13:42 120

原创 HTTP发展史

HTTP0.9 只有get方法,没有请求头相应头状态码 只能发送html内容;HTTP1.0 增加了请求头响应头状态码 增加了POST方法;支持了其他内容的传输;但是,还是有一些缺点 比如说 连接无法重复使用啊,下一个请求必须等前一个请求返回后才可以发送;HTTP1.1主要就是解决这些问题(当前主要是使用这个):1HTTP1.1增加了keep-Alive 可以实现HTTP连接的复用;2.使用了管线化 多个请求可以一起发送 3 : 增加了更多的缓冲策略 4 Host头处理 之前的1.0是没有主机名的 但是

2021-01-11 10:49:06 61

原创 String有关拼接问题

我们都知道如果是在很多String拼接的时候,选择StringBiluder 效率会更高;那么,原因是什么呢?其执行如下:final char c1[] = {'h','e','l','l','o'};final char c2[] = {'w','o','r','l','d'};final char c3[] = new char[10];c3[] = {'h','e','l','l','o','w','o','r','l','d'};所以,String 在运算时,会创建一个大小合适的c

2021-01-10 16:32:53 183

原创 guns 企业版 v3.4开发

项目导入1.首先,先将项目打开;然后导入maven点击ok;结果如下图所示,代表导入成功;修改yml配置信息:写成自己数据库的启动项目:此时,进行代码生成测试:在代码生成之前先做一下准备工作:在sys文件夹下面新建一个modularA文件夹在webapp下面新建一样的目录来放html和 js文件下面四个需要进行对应此时,会下载一个文件,把该文件进行解压;将cn复制到java上将html 和js 也复制到指定位置点击查询按钮,将sql中数据在guns_advanced中进

2020-12-29 16:52:19 256

原创 AOP理解

面向切面编程AOPAOP 编程 把业务功能分为核心、非核心两部分;核心业务比如说订单系统啊,会员系统啊;非核心业务比如说日志模块,过滤模块;在常见的编程开发中,核心系统,比如说:订单系统,它需要自己的日志模块;而会员系统也需要自己的日志模块;而我们的AOP编程就是将非核心业务功能定义为切面,核心业务和非核心业务被分别进行独立开发,然后把切面功能和核心业务“编织”在一起。AOP就是将那些于业务无关,却为业务模块所共同调用的逻辑封装起来,以便减少系统的重复代码,降低系统的耦合度,利于未来的扩展和维护。

2020-12-15 09:00:47 99

原创 Java中位操作,以及在日常编码中的使用

机器中是如何存储的背景:在计算机中,有原码、反码、补码三种形式,首先先介绍一下原码:所谓的原码:表达简单明了,是人类最容易理解的表示法;但是,原码有一个很大的弊端,使用原码进行计算的时候非常复杂,特别是两个操作数符号不一样的时候。步骤如下:1.判断两个数绝对值的大小 2.使用绝对值大的数减去绝对值小的数 3.对于符号数,以绝对值大的为准。所以,需要一种使用加法来替代减法的操作,从而消除减法。为了解决这个问题补码出现了;在计算机中,存储数据是使用补码来进行存储的。那么 : 原码 反码 补码 之间的

2020-12-14 21:15:33 111

原创 Mybatis源码分析

MyBatis 简介:MyBatis(Java写的)的持久化解决方案将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以以面向对象的方式进行持久化操作。底层数据库连接的获取、数据访问的实现、事物控制和数据库连接的关闭等都无须用户关系,从而将应用层从底层的JDBC中抽取出来,通过配置文件管理JDBC连接,让MyBatis完成持久化访问的实现。个人总结一下;就是用传统的JDBC操作比较麻烦,而用了MyBatis框架以后,就可以让用户只关注sql语句,不关

2020-11-06 12:50:43 74

原创 代理模式

代理模式定义:为其他对象提供一种代理,以控制对这个对象的访问。代理对象起到中介作用,可去掉功能服务或增加额外的服务。举例:我想购买一个火车票,正常我们是去火车站进行买,但是,由于我们家比较远,我们可能去火车票代售点进行购买,而且,火车票代售点可能会有电话预约的额外功能,但是,可能不支持退票服务。就像我们的代理模式:去掉功能服务,增加额外服务。常见代理模式1.远程代理:比如说我有一个售货店,我可以通过远程代理监控各个店铺使之能直观的了解店内信息。2.虚拟代理: 根据需要将资源消耗很大的对象进行延迟,

2020-11-04 14:09:27 91

原创 jvm 类加载和类加载器

概述:一个类从被加载JVM开始,到卸载出内存,整个生命周期如图加载:查找并加载类文件的二进制数据所谓直接引用,就是将类直接引用到他们依赖的,或者想要引用的目标。类加载要完成的功能一般,我们做的程序是由应用程序类加载器来加载的。加载一些基础的核心的基础模块类。这个为null就说明它的加载器是启动类加载器。 启动类加载器为null这里在java8中没有,不测试了上面演示的是启动类的加载器。这个时候,就可以看到,在java8中,AppClassLoader的父类是Ext.

2020-10-27 20:12:42 394

原创 Future和Callable --治理线程第二大法宝

Runnable的缺陷有两大缺陷;1.不能返回一个返回值,返回值为void2.也不能抛出checked Exception在run()方法中,无法抛出异常,只能使用try catch 来处理异常;下面的那个对比方法是可以抛出异常的;为什么又这样的缺陷?因为它设计的时候,方法返回值为void 而且也设计成无法抛出异常;Runnable 为什么设计成这样?如果抛出异常后,就给Thread 这时候没办法处理;所以,就设计成为直接在Runnable中进行处理;针对于无法抛出检查后异常这..

2020-10-21 16:22:49 94

原创 AQS 并发灵活人物

为什么需要AQS理解相似点:比如说,锁只能允许一个线程,而Semaphore,只允许一定量的线程。比如说:他们还可以去看一看目前是不是陷入等待,tryLock() tryQuire()方法,还有在一定时间内尝试获取。代码演示:可以看到他有一个Sync内部类。进入这个内部类,可以看到它继承了AQS(这是类的缩写)结论:在Semaphore中,有一个Sync内部类,这个内部类是继承了AQS其实CountDownLatch也是这样的;其实,在ReentrantLock()中,其实也...

2020-10-21 12:54:02 77

原创 java JVM总览

左边是java的开发环境,右边是java的运行环境。右边:java会把java字节码文件,通过Java类装载器,装载在虚拟机上。当装载过程中,也会对字节码文件进行认证。比如说,认证你这个字节码文件是不是格式正确啊。在转载过程中也会转载一些Java类库。(也就是说,必须要由虚拟机提供的功能,也必须通过虚拟机的类装载器,在这个过程进行装载)当把这些需要的东西转载过后,虚拟机会把这些东西交给java解释器。java解释器会对咱们的字节码进行解释并执行。进行运行期等。当然这个区间会很麻烦。这就是java..

2020-10-16 15:18:56 72

原创 线程协作、控制并发流程

控制线程什么是控制并发流程:如果不控制的情况下,那么并发的各个流程他会尽可能的跑。同时,它会收到并发控制器的控制,不受我们程序员的控制。有的时候,我们要求一些任务,它先执行,一些任务必须等我前一些任务执行完毕之后,再执行。这时候,我们必须控制它。所以:CountDownLatch类:分析如下:Ta调用await()来进行等待,它要等待3,这时候,线程1,它会调用countDown()给他减一。然后,线程1继续执行。等countDown()调用三次以后。Ta线程就被唤醒了。代码如下:...

2020-10-16 13:52:27 93

原创 并发队列

并发队列Queue:阻塞队列队列:底层由链表实现;BlockingQueue:阻塞队列,当要取一个数据时,如果队列中没有,就会一直等待。当要存一个数据时,如果数据满了,也会一直等待,直到队列有空出来为止。方法介绍:put,往队列中添加一个数,如果队列已经满了,就堵塞住;take 在队列中拿出一个数,如果队列是空的,就堵塞住;add 往队列中添加一个数,如果队列已经满了,会抛出异常remove 往队列中移除一个数,如果队列空了,会抛出异常element 查看队列中第一个数

2020-10-14 10:14:49 110

原创 CopyOnWriteArrayList

CopyOnWriteArrayListCopyOnWriteArrayList诞生记适用场景CopyOnWriteArrayList:就是不能一起写,可以一边读一边写,也可以一边写一边读。从这个方面来说,比读写锁强,读写锁是可以多读一写。代码演示package copyonwrite;import java.util.ArrayList;import java.util.Iterator;/** * 描述: 演示CopyOnWriteArrayList可以在迭代过程中修改

2020-10-13 20:57:11 213

原创 ConcurrentHashMap等并发集合

##并发容器精讲并发容器概览集合类的历史进入查看它的方法:发现了synchronized的同步方法,然后,会发现他的很多方法都是synchronized修饰的由于有多个同步方法,而同步方法是不能由多个线程同时执行的,所以说,他的性能不会很安全。下面经常查看Hashtable,发现情况是一样的。所以,Hashtable效率不是很高。升级版代码演示:package collections.predecessor;import java.util.ArrayLis

2020-10-13 16:20:05 175

原创 并发学习--final

因为别人只能进行读取,却不能进行更改。类用final反正被继承,方法用final防止被重写,变量用final防止被修改。例子如下:final修饰变量代码演示如下:package immutable;public class FinalVariableDemo { // 如果不赋值直接报错 private final int a = 6; private final int b; private final int c; /...

2020-10-11 14:18:35 61

原创 CAS原理

CAS原理面试中常客很多原子类的底层原理,也是乐观锁的底层原理。比如说,面试官问你知道什么锁,你说乐观锁,问乐观锁的原理是什么:你说CAS原理,他让你在介绍一下CAS原理CAS是一种用于并发的算法比如说CPU1想把内存中的值从56改成57;cpu1去查发现是56。于是,就改成了57。当CPU2想把内存中的值从55改成56,他去查了,发现里面数据是57,那么他就不能改了。他可能会重试或者报错,但是,肯定是不会进行更改的。CAS的原子性是由CPU进行保证的。下面对CPU的原子性进行模拟

2020-10-10 16:43:29 59

原创 原子类

原子类注意:就第三个方法来说,如果是写a++ 那么其实它是分成三个部分的。a先赋值,a加1,a再重新赋值。原子类线程安全代码如下;package atomic;import java.util.concurrent.atomic.AtomicInteger;/** * 演示AtomicInteger的基本用法,对比非原子类的线程安全问题 * 使用了原子类之后,不需要加锁,也可以保证线程安全。 */public class AtomicIntegerDemo1 impl

2020-10-10 15:17:01 73

原创 并发学习--锁

章节情况:第一部分为什么需要lock第一点:就是说synchronized 它只有在执行完代码,或者里面抛出异常的时候,才会进行释放锁。第二点:不够灵活,加锁和释放锁的时机单一第三点:不知道能不能获取到锁lock的优点lock():方法要是陷入了死锁,就会一直进行等待。所以,也非常的不好。为了解决这个问题,出现了tryLock()这个方法下面先介绍tryLock的兄弟方法如果一定时间内,可以得到锁就成功,不能得到就放弃。用了tryLock这个方法可以避免死锁的问题.

2020-10-08 18:50:05 64

原创 ThreadLocal详解

第一种应用场景主要解决的是,工具类线程不安全,需要去解决工具类线程不安全的问题。第二种应用场景主要解决的是,参数传递麻烦的问题。下面进行的是SimpleDateFormat进行之路package threadlocalpratice;import java.text.SimpleDateFormat;import java.util.Date;public class ThreadLocalNormalUsage00 { public String data(int seco..

2020-10-05 21:14:38 272

原创 并发学习--线程池

并发学习并发工具类 - 分类第一类:为了并发安全第二类:管理线程 提高效率第三类:线程协助线程池的重要性什么是池 ? 可以理解为计划经济 比如说我们的资源总量是有限的,就我电脑来说,我电脑有16个线程。所以,我就可以创建16个线程的线程池,我的任务可能很多,就依靠这16个线程来慢慢执行。然后,也不用创建的多,因为创建线程有多开销的。所以:好处主要是有两个;第一个:可以复用我们的每一个资源第二个:可以控制我们资源的总量如果不用线程池,一个任务一个对应一个线程,那么1000个任务就需要创建1

2020-10-02 16:03:38 98

原创 String相关学习情况

##String首先,String 重写了hashCode 和 equals 方法。注意:== 和 hashCode 还是有区别的,==:它代表的是完全相同。equals:它更多代表的“值相等”。当然如果没有重写equals方法的话,那么equals就是以==来进行判断的。下面以String 为例子来分析以下的各种情况:public class StringTest { public static void main(String[] args) { //编译期就可以确

2020-09-23 21:41:40 140

原创 org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer错误分析

Exception in thread “main” java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationContextInitializer : org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializerat org.springframewo

2020-09-22 14:05:51 2211

原创 动态规划上

动态规划首先,动态规划问题一般形式就是求最值。比如说求最大递增子序列,最小编辑距离核心问题是穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值。但是,动态规划的穷举问题有点特别,这类问题存在重叠子问题,如果暴力穷举的话效率非常低,需要备忘录来优化穷举过程,避免不必要的重复。穷举所有的可行解需要列出正确的状态转移方程,才能正确的穷举,这个是最困难的一步。思维框架明确 基本情况 -> 明确状态 -> 明确选择 -> 定义dp数组/函数的含义注意:用递归的时候

2020-09-15 16:19:55 138

原创 类加载机制与反射

反射通过反射查看类信息Java程序中的许多对象在运行时都会出现两种类型:编译时类型和运行时类型,例如:Person p = new Student(); 该变量的编译时类型为Person,运行时类型为Student;除此之外,还有更加极端的情形,程序在运行时接受到一个外部传来的一个对象,该对象在编译时类型时Object,但是程序又需要调用该对象运行时的类型的方法。为了解决这一问题,程序需要在运行时发现对象和类的真实信息。解决该问题有以下两种方法:1.第一种做法是假设在编译时和运行时都完全知道对象和类

2020-08-26 18:41:34 91

原创 建造者模式

引用场景假设有一个汽车产品,汽车有启动、停止、喇叭、引擎声、都是需要由用户自己控制,顺序和数量都需要由用户自己控制。这个需求实现如下:package factory_mode.builder;import java.util.ArrayList;/** * 车辆模型的抽象类 * 使用模板方法 */public abstract class CarModel { //这个参数是各个基本方法执行的顺序 private ArrayList<String> sequ

2020-08-20 15:16:22 70

原创 工厂模式

工厂模式用工厂方法代替new操作什么情况下适合工厂模式1.有一组相似的对象需要创建(比如说:创建毛巾的工厂不能用来创建汽车)2.在编码时不能预计需要创建那种类的实例(比如说,创建水果,但是需要创建的水果有很多,暂时不知道需要创建多少水果)项目中的现状:在软件系统中经常面临着,对象的创建工作,由于需求的变化,这个对象可能随之也会发生变化,但它却拥有比较稳定的接口。为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保证系统中其他依赖该对象的对象不随着需求变化而变化。...

2020-08-19 20:14:24 99

原创 设计模式--单例模式

单例模式单例模式:就是一直以来只有一个类的实例对象,有些对象只需要一个时候,比如配置文件、工具类、线程池、缓存、日志对象等。如果创造出多个实例,就会导致许多问题,比如占用过多资源,不一样的结果等。通过单例模式,保证整个应用中的某个实例有且只有一个。饿汉模式package Singleton;/** * 单例模式:Singleton * 应用场合:有些对象只需要一个就足够了。 * 作用:保证某个应用程序在某个实例有且只有一个。 */public class Singleton {

2020-08-19 12:54:02 75

原创 设计模式-模板方法模式

生活中模板比如说去银行办理业务1.进门取号2.填写单据3.等待叫号4.窗口办理这是银行给我们提供的模板,大家都得遵守,但是呢?在填写单据的过程中,又存在着一些不同,这就是模板给我们一些发挥空间。模板方法模板方法会提供一些算法框架,但是一些特点步骤实现需要子类进行实现。留给特定子类来实现。定义如下:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。使用场景分析:会发现有很多共性,比如第一步和第三步;...

2020-08-19 10:09:06 80

《Java开发手册》高清版.pdf

java开发手册 高清版

2020-10-19

ngrok.rar 免费内网穿透技术

ngrok内网穿透技术免费 非常适合开发,所要积分低,我下载的时候33 适合大家

2020-08-10

guns-vip-master --含代码生成--V3.4.zip

guns-vip-master --含代码生成--V3.4 vip才有的框架,非常适合快速入门。有兴趣的可以下载一下。

2020-07-13

Guns系列教程 网盘链接.txt

Guns基于SpringBoot, 致力于做更简洁的后台管理系统,完美整合springmvc + shiro + mybatis-plus + beetl + flowable! Guns项目代码简洁,注释丰富,上手容易, 同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),可以直接作为一个后台管理系统的脚手架.

2020-05-19

空空如也

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

TA关注的人

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