自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Canvas渐变文字

【代码】Canvas渐变文字。

2023-05-24 14:32:14 653

原创 uniapp uni-popup弹出框中的canvas不显示失效

解决uniapp中 canvas嵌套在uni-popup中时,cavas不显示或显示空白的问题。

2023-05-24 12:19:25 1715 1

原创 常见的Bean初始化生命周期接口执行顺序

记录一下SpringBean在容器中初始化时常见的生命周期接口回调。

2022-10-28 12:17:58 573

原创 DynamicDataSource是如何解决多数据源的事务问题?

DynamicDataSource解决多数据源的事务问题的原理,利用了ThreadLocal+本地事务connection管理进行解决

2022-10-09 14:43:43 3579 1

原创 web.xml中ContextLoaderListener如何创建Spring容器?

web.xml中ContextLoaderListener如何创建Spring容器?

2022-09-25 18:49:37 333

原创 SpringBoot是如何管理RabbitMQ中的Channel?

Channel是什么RabbitMQ是AMQP0-9-1协议的实现,先来看看AMQP0-9-1协议中对通道Channel的阐述。有些应用程序需要与broker建立多个连接。但是,保持多个TCP连接同时打开是不可取的,因为这样做会消耗系统资源,使配置防火墙更加困难。AMQP0-9-1的Connection可以多路复用,Channel可以被认为是“共享一个TCP连接的轻量级连接”。客户端执行的每个协议操作都发生在一个channel上。在特定channel上的通信与在另一个channel上的通信完全独立

2022-01-06 11:16:25 3542

原创 面试官:线程池执行过程中遇到异常会发生什么,怎样处理?

线程遇到未处理的异常就结束了这个好理解,当线程出现未捕获异常的时候就执行不下去了,留给它的就是垃圾回收了。线程池中线程频繁出现未捕获异常当线程池中线程频繁出现未捕获的异常,那线程的复用率就大大降低了,需要不断地创建新线程。做个实验:public class ThreadExecutor { private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, n

2021-12-20 11:31:39 715 1

原创 Java8新特性中的常用Stream流操作

一些流操作的示例: // 1.创建一个无限流, 2.限制流元素的个数 List<String> echos = Stream.generate(() -> "Echo").limit(20).collect(Collectors.toList()); System.out.println(echos); System.out.println(echos.size()); //[Echo, Echo, Echo,

2021-12-16 10:57:37 820

原创 如何优雅的将Java对象以Hash结构存入Redis

Java中的对象非常相似,却不能按照Java对象的结构直接存储进Redis的hash中。因为Java对象中的field是可以嵌套的,而Redis的Hash结构不支持嵌套结构。(不允许套娃~)。

2021-12-12 11:48:10 5314

原创 HashMap的默认容量为何为16?为何是2的整数倍?

对于HashMap的table而言,数据分布需要均匀(最好每项都只有一个元素,这样就可以直接通过数据下标直接找到),不能太松,浪费空间。不能太紧,查询变慢。计算hash值后,怎么才能保证table元素分布均匀呢?我们会想到取模,但是由于取模的消耗较大,HashMap是这样处理的:调用indexFor()方法static int indexFor(int h, int length) { return h & (length-1);}返回的是key的hashcode跟初始容量-1做与运算

2021-12-11 10:12:13 675

原创 HashMap默认加载因子的作用?

HashMap有两个参数影响其性能:初始容量加载因子容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表的容量不足时进行扩容的阈值,即达到多满的一种度量。当哈希表中的条目数超出了默认加载因子与哈希表总容量的乘积是,则要对哈希表进行扩容、rehash操作(重建内部数据结构,位置分布),默认是扩容到原容量的2倍。我对加载因子的理解是:即哈希表中数据的严密紧凑程度  通常确定加载因子值的重要因素就是在时间和空间的成本上寻求一种折中。加载因子过高,例如为1,虽然减少了内存你

2021-12-10 21:05:20 1221

原创 数据结构-到底什么是Hash散列表?

一、散列表1.1 散列表  散列表(哈希表),其思想主要是基于数组支持按照下标随机访问数据,时间复杂度为O(1)的特性。可以说是数组的一种拓展。假设,我们为了方便记录某高校数学专业的某个学生的信息,要求可以按照学号(入学时间+年级+专业+专业内自增序号,如2019 1001 0002)能够快速找到某个学生的信息。这个时候我们可以取学号的自增序号部分,即后四位作为数组的索引下表,把学生相应的信息存储到对应的内存空间内即可。  如上图所示,我们把学号作为Key,通过截取学号后四位的函数计算后得到索引下标

2021-12-10 20:44:58 457

原创 Redis击穿、穿透、雪崩产生原因以及解决思路

前言:大家都知道计算机性能的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些被频繁访问的热点数据放在内存中,随用随取,降低连接到数据库的请求连接和IO存取,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发的前提下,比如当缓存中某一个热点key失效时:击穿问题起因:有两个主要原因:Key过期Key被页面置换淘汰对于第一个原因是因为在Redis中,Key有过期时间,如果某一个时刻(加入商城做活动,0点开始秒杀)Key失效,那么零点之后都某

2021-12-06 21:05:31 129

原创 redis键值出现 \xac\xed\x00\x05t\x00&的解决方法

笔者在使用redis存放键值对时,发现存放的key和value多了\xac\xed\x00\x05t\x00&的前缀,笔者存放的是字符串,结果如下图所示,出现非预期的前缀。出现该问题的原因是, redis template向redis存放使用java对象序列化的值,序列化方式和string的一般方式不同。明明指定的另一个引文字符串作为key,但是实际存储后却多出来一串奇异字符串,这让笔者好奇心顿时升起来了,决定debug调试一下从set()方法进入一路对execute()的重载方法向下跟

2021-11-23 15:05:10 17978 3

原创 MySQL使用INTO OUTFILE和LOAD DATA INFILE导出导入百万级数据文件

MySQL数据库的备份与恢复(1)——使用Select Into Outfile和Load Data Infile命令MySQL使用SELECT…INTO OUTFILE导出文本文件MySQL中,可以使用SELECT…INTO OUTFILE语句将表的内容导出为一个文本文件。其基本的语法格式如下:SELECT [列名] FROM table [WHERE 语句] INTO OUTFILE '目标文件' [OPTION];该语句分为两个部分。前半部分是一个普通的SELECT语句,通过

2021-11-16 15:46:11 2011

原创 JAVA静态代理和动态代理的区别?

代理简述代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。他们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。按理说,顾客可以直接从厂家购买产品,但是现实生活中,很少有这样的销售模式。一般都是厂家委托给代理商进行销售,顾客跟代理商打交道,而不直接与产品实际生产者进行关联。所以,代理就有一种中间人的味道。接下来,我们说说软件中的代理模式。代理模式代理模式是面向对象编程中比较常见的设计模式。这是常见代理模式常见的 UML 示意图。需要注意

2021-11-03 20:51:14 359

原创 BigDecimal保留两位小数,不足两位补0

// 四舍五入BigDecimal value = new BigDecimal(object.toString()).setScale(2,BigDecimal.ROUND_HALF_UP); // 不足两位小数补0DecimalFormat decimalFormat = new DecimalFormat("0.00#");String strVal = decimalFormat.format(value);

2021-10-27 10:47:17 3146

原创 JWT令牌的工作原理

这里写目录标题JSON Web Tokens基于Token的身份认证与基于服务器的身份认证基于服务器的身份认证基于Token的身份认证基于Token的身份认证是如何工作的用Token的好处无状态和可拓展性安全JWT和OAuth的区别JSON Web Tokens在认证的时候,当用户用他们的的凭证成功登录以后,一个JSON Web Token将会被返回。此后,用户名和密码就不再是用户的凭证,而token是用户用来访问资源的新凭证了。你必须非常小新以防止出现安全问题。一般而言,你保存令牌的时间不应该超过你所

2021-10-26 20:26:32 267

原创 使用JWT实现Token认证

为什么使用JWT随着技术的发展,分布式web应用的普及,通过session管理用户状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去redis中的缓存中获取用户信息,随着之后JWT的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单,这里还有一个在线的JWT生成器什么时候应该用JSON Web Tokens下列场景中使用JSON Web Token是很有用的:Authori

2021-10-26 19:45:57 437

原创 使用AopContxt.currentProxy()方法获取当前类的代理对象

常规使用SpringAOP功能,都是对一个Service中的B方法进行切入记录日志,这些时候AOP是能起作用的。但是假如B方法被Service中的A方法调用,在B方法上的切入便会失效,导致无法记录日志。要弄清楚切入失败的原因,就要先了解切入的原理。为什么能够切入目标对象,原理就是创建了代理类,在代理类中调用目标方法的前后进行切入。比如说目标对象是service,代理对象是$proxy0,这时候切入对B方法的调用就是$proxy0.B(),执行流程就是先执行切面中的逻辑比如记录日志,然后再invoke调用

2021-10-25 15:46:47 3487

原创 @Transactional和@DS如何在事务中切换数据源

背景在一次需求中,需要对两个数据库进行读写操作,并且要保证对这两个库的操作的原子性。所以就在一个service方法中加入了@Transaction,方法中包含了对两个库的操作。spring: datasource: dynamic: primary: A datasource: A: url:.. driver-class-name: com.mysql.jdbc.Driver userna

2021-10-25 15:02:10 5630 3

原创 request.getInputStream()输入流只能读取一次问题

背景通常对安全性有要求的接口都会对请求参数做一些签名验证,而我们一般会把验签的逻辑统一放到过滤器或拦截器里,这样就不用每个接口都去重复编写验签的逻辑。在一个项目中会有很多的接口,而不同的接口可能接收不同类型的数据,例如表单数据和json数据,表单数据还好说,调用request的getParameterMap就能全部取出来。而json数据就有些麻烦了,因为json数据放在body中,我们需要通过request的输入流去读取。但问题在于request的输入流只能读取一次不能重复读取,所以我们在过滤器或拦截

2021-10-23 17:26:53 5830 2

原创 SpringSecurity之RememberMe实现

RememberMe的实现一定离不开Token的持久化存储。来看看使用Security应该怎么用RememberMe功能RememberMe实现的两个模式Security中有着两个实现RememberMe功能的实现类,但是都离不开持久化Token。AbstractRememberMeServices的实现类PersistentTokenBasedRememberMeServices服务端或数据库保存Cookie其中tokenRepository属性时存储的方案:InMemoryToken

2021-10-17 19:25:59 305

原创 SpringSecurity之RememberMe功能的原理

在大多数网站中,都会实现RememberMe这个功能,方便用户在下一次登录时直接登录,避免再次输入用户名以及密码去登录,下面,主要讲解如何使用Spring Security实现记住我这个功能以及深入源码探究它的原理。首先,如下图所示为Spring Security实现RememberMe功能的原理图:核心接口:RememberMeService先来看看RememberMeService接口的3个方法方法名执行时间描述autoLogin收到请求时,由RememberMeA

2021-10-17 19:07:28 497

转载 CentOS Firewall常用命令汇总,开放端口及查看已开放的端口

1、firewalld的基本使用启动: systemctl start firewalld查看状态: systemctl status firewalld停止: systemctl disable firewalld禁用: systemctl stop firewalld2.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。启动一个服务:systemctl start firewalld.service关闭一个服务:syst

2021-10-11 20:41:53 1034

原创 uniapp-text组件输入纯数字或者英文不换行的问题

在uni-app的text中输入纯数字或者英文不换行的问题遇到的小问题,使用uni-app的text,输入了一串纯数字不换行。解决办法:设置如下CSS样式: word-break:break-all word-wrap:break-wordword-wrap:css的 word-wrap 属性用来标明是否允许浏览器在单词内进行断句,这是为了防止当一个字符串太长而找不到它的自然断句点时产生溢出现象。word-break:css的 word-break 属性用来标明怎么样进行单词内的断句。主

2021-10-07 19:53:43 2332 1

原创 uni-app的uni.request()请求封装

第一种:常见的直接发起uni.request()请求 onLoad() {//页面加载时调用 this.getSwipers() }, methods: { //获取轮播图数据 getSwipers(){ uni.request({ url:"https://api-hmugo-web.itheima.net/api/

2021-10-06 19:40:28 1270

原创 uniapp-页面间通信

uni中的导航跳转navigate APIuni.navigateTo(OBJECT)保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。OBJECT参数说明参数类型必填默认值说明平台差异说明urlString是需要跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 ‘path?key=value&key2=value2’

2021-10-06 16:11:04 1823

原创 uniapp-路由和navigate跳转

路由uni-app页面路由为框架统一管理,开发者需要在pages.json里配置每个路由页面的路径及页面样式。类似小程序在app.json中配置页面路由一样。所以 uni-app 的路由用法与 Vue Router 不同,如仍希望采用 Vue Router 方式管理路由,可在插件市场搜索 Vue-Router路由跳转uni-app 有两种页面路由跳转方式:使用navigator组件跳转、调用API跳转。页面栈框架以栈的形式管理当前所有页面, 当发生路由切换的时候,页面栈的表现如下:路由方

2021-10-06 14:55:22 4805

原创 uniapp-条件编译跨端兼容

跨端兼容uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足。但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况。大量写 if else,会造成代码执行性能低下和管理混乱。编译到不同的工程后二次修改,会让后续升级变的很麻烦。在 C 语言中,通过 #ifdef、#ifndef 的方式,为 windows、mac 等不同 os 编译不同的代码。uni-app 参考这个思路,为 uni-app 提供了条件

2021-10-06 14:07:22 312

原创 uniapp-CSS内置变量

uni-app 提供内置 CSS 变量CSS变量描述APP小程序H5–status-bar-height系统状态栏高度系统状态栏高度、nvue注意见下25px0–window-top内容区域距离顶部的距离0NavigationBar 的高度–window-bottom内容区域距离底部的距离0TabBar 的高度注意:var(–status-bar-height) 此变量在微信小程序环境为固定 25px,在 App 里为手机实际状态栏高

2021-10-06 11:46:24 5112

原创 Maven中DependencyManagement 和 Dependency的区别

Maven 使用DependencyManagement元素来提供了一种管理依赖版本号的方式。通常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。使用pom.xml 中的 dependencyManagement 元素能让所有在子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个dependencyManagemnt 元素中指定的版本号。例如在父项目

2021-02-01 18:34:09 271

原创 SpringBoot2核心技术-笔记

文章目录@[toc]第一季:SpringBoot2核心技术1.SpringBoot2基础入门1.1 什么是SpringBoot?1.1.1 Spring的生态圈1.1.2 SpringBoot存在的意义1.1.3 SpringBoot的优点1.1.4 SpringBoot的缺点1.1.5 时代背景1.2 SpringBoot2入门1.2.1 Maven配置1.2.1.1 Mirror国内镜像仓库1.2.1.2 profile个性化默认配置1.2.2 引入依赖1.3 创建主程序 *主启动类*1.4 简化部署(

2021-02-01 09:48:42 2233

空空如也

空空如也

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

TA关注的人

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