自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring中的拦截器

1.Spring中的拦截器 在web开发中,拦截器是经常用到的功能。它可以帮我们验证是否登陆、预先设置数据以及统计方法的执行效率等等。 今天就来详细的谈一下spring中的拦截器。spring中拦截器主要分两种,一个是HandlerInterceptor,一个是MethodInterceptor。1.1HandlerInterceptor拦截器这里我们可以实现一个通过HandlerInterceptor实现打印请求开始和结束的日志,如下。1.依赖引入 ...

2021-12-30 14:09:14 7059

原创 Spring boot中通过Aop和拦截器实现自定义注解

前言 最近遇到了这样一个工作场景,需要写一批dubbo接口,再将dubbo接口注册到网关中,但是当dubbo接口异常的时候会给前端返回非常不友好的异常。所以就想要对异常进行统一捕获处理,但是对于这种service接口使用@ExceptionHandler注解进行异常捕获也是捕获不到的,应为他不是Controller的接口。这时就想到了自定义一个注解去实现异常捕获的功能。实现通过拦截器+AOP实现自定义注解的实现1.引入相关依赖spring-boot-starter:s...

2021-12-28 11:31:35 3223

原创 Git的使用

git loggit commitgit rebasegit add git init git remort

2021-12-21 17:10:27 229

原创 mapstruct-通用类转换方案

前言 在我们Java开发的过程中不可避免的会遇到需要将一个类转换为另一个类的情况,比如我们从数据中或者别人的接口中查询出来的类转换为我们对外展示所用的视图类。可能有人会说,那直接用返回的类当做视图类不就可以了,还省了转换的步骤和时间。但是如果当返回内容增加或修改时就很容易污染我们的对外视图类,所以类转换也变得不可或缺。下面将展示四种种类转换方式。类型转换方式一:JSONCategoryVo categoryVo = JSONObject.parseObject(JSONObje...

2021-12-14 18:44:16 3784

原创 设计模式-适配器模式

目录前言介绍示例前言 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 适配器模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。 以上内容是他相对官方的一个解释,在看的过程中我想起了苹果充电器...

2021-12-09 15:52:48 113

原创 JaCoCo-测试可度量化

最近为了响应公司要求,大家都在积极(无奈)的补单元测试,要求单元测试行覆盖率达到*%,在之前的概念中,并没有了解过如何统计我们单元测试的行覆盖率,这次接触到JaCoCo也让我非常惊喜,它可以帮我们非常直观的看到单元测试的代码层面的覆盖情况,不过这个仅针对Java代码,大家酌情选择,下面和大家一起分享下吧。一、JaCoCo的使用1.引入插件在pom.xml中引入我们的JaCoCo插件,如下: <plugin> &...

2021-12-09 10:31:57 1093

原创 Java中如何优雅的把Map转为对象

对于一个Map我们如何把它转成对应的对象呢,除了Json我们还可以利用反射,更快捷public class Person { private String userName; private int age; public String getUserName() { return userName; } public int getAge() { return age; } publi

2021-12-09 09:43:41 39890 3

转载 Groovy脚本基础全攻略

1 背景Groovy脚本基于Java且拓展了Java,所以从某种程度来说掌握Java是学习Groovy的前提,故本文适用于不熟悉Groovy却想快速得到Groovy核心基础干货的Java开发者(注意是Java),因为我的目的不是深入学习Groovy语言,所以本文基本都是靠代码来解释,这样最直观,同时也够干货基础入门Groovy的特点和结构。开始介绍前先给一个大法,《官方权威指南》英文好的可以直接略过本文后续内容,我需要的只是Groovy皮毛;再次向Groovy的标志致敬,左手一个Java,右手一个G

2021-12-08 10:53:34 13757

原创 groovy测试框架-Spock入门

Spock 是用于 Java 和 Groovy 应用程序的测试和规范框架。使它从人群中脱颖而出的是其美丽且极具表现力的规范语言。由于其 JUnit 运行器,Spock 与大多数 IDE、构建工具和持续集成服务器兼容。Spock 的灵感来自JUnit、jMock、RSpec、Groovy、Scala、Vulcans和其他迷人的生命形式。一、入门1.1.定义一个Spock测试类class MyFirstSpec extends Specification {....}...

2021-12-07 10:34:58 1321

原创 记录解决Spring Cloud+nacos注入失效的问题

记录springClound以nacos为配置中心遇到的问题问题的关键字:springCloud nacos的配置加载不进去@Value 拉取不到nacos配置的内容java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blankat com.alibaba.nacos.api.naming.utils.NamingUtils.getGroupedName(NamingUtils.ja

2021-10-28 13:40:22 3443 1

原创 Hibernate Validator简介

亲爱的小伙伴们我来填坑啦,java中优雅的参数校验方法中的校验的实现原理。1.前言 验证数据是发生在所有应用程序层(从表示层到持久层)的常见任务。通常在每一层中实现相同的验证逻辑,这既耗时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证代码混淆,验证代码实际上是关于类本身的元数据。JSR 380 - Bean Validation 2.0 - 定义了用于实体和方法验证的元数据模型和 API。默认元数据源是注释,能够通过使用 XML 覆盖和扩展...

2021-10-26 15:58:56 868

转载 Java中如何重复的在一个地方使用自定义注解

JAVA注解学习-@Repeatable注解_madman-CSDN博客_@repeatable

2021-10-25 19:47:51 137

原创 java中优雅的参数校验方法

一、引子要对方法的参数进行校验,最简单暴力的写法是这个样子: public static void utilA(String a,BigDecimal b){ if (StringUtils.isEmpty(a)){ System.out.println("a不可为空"); return; } if (b == null){ System.out.println("b不可为

2021-10-21 11:02:16 3973

原创 Spring Bean的生命周期及预处理

生命周期spring中bean生命周期的四个阶段: 1. 实例化Instantiation 2. 属性赋值Populate 3. 初始化Initialization 4. 销毁Destruction各个阶段的工作: 1. 实例化,创建一个Bean对象 2. 填充属性,为属性赋值 3. 初始化 ○ 如果实现了xxxAware接口,通过不同类型的Aware接口拿到Spring容器的资源 ○ 如果实现了BeanPostProcessor接口,则会...

2021-10-19 11:14:43 175

转载 Spring boot整合dynamic-datasource实现多数据源的读写分离

多数据源的读写分离参考文章:https://mybatis.plus/guide/dynamic-datasource.html本文环境:版本springboot 2.1.0.RELEASEdruid 1.1.18dynamic-datasource 2.4.21、maven依赖配置<!-- druid --> <!-- https://mvnrepository.com/artifact/com.alibaba/...

2021-09-29 15:04:55 732

转载 springboot jndi禁用

摘要:在实际项目开发中使用springboot的时候,可以使用jar包的方式运行项目,也可以将springboot项目打成war包使用。springboot war包运行可能会出现 [localhost-startStop-1] DEBUG org.springframework.jndi.JndiLocatorDelegate - Converted JNDI name [java:comp/env/LOGGING.pattern_level] not found - trying original na

2021-09-29 14:57:29 1049

原创 Curator简介

1.简介 Curator 框架是一个高级 API,它极大地简化了 ZooKeeper 的使用。它添加了许多基于 ZooKeeper 构建的功能,并处理管理与 ZooKeeper 集群的连接和重试操作的复杂性。其中一些功能是: 自动连接管理:存在需要 ZooKeeper 客户端重新创建连接和/或重试操作的潜在错误情况。Curator 自动且透明地(大部分)处理这些情况。 监视 NodeDataChanged 事件并根据需要调用 updateServerList()。 更清洁的 ...

2021-09-28 18:09:53 447

转载 略述三次握手与四次挥手

三次握手 在HTTP/1.0中这个TCP连接是在http请求创建的时候同步创建的,http请求发送到服务器端,服务器端响应了之后,这个TCP连接就关闭了; HTTP/1.1中可以以某种方式声明这个连接一直保持,一个请求传输完之后,另一个请求可以接着传输。这样的好处是:在创建一个TCP连接的过程中需要“三次握手”的消耗,“三次握手”代表有三次网络传输。 如果TCP连接保持,第二个请求发送就没有这“三次握手”的消耗。HTTP/2中同一个TCP连接里还...

2021-07-26 09:57:53 92

原创 略述Http与Https

简介Http 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。Https 为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SS...

2021-07-26 09:46:17 109

原创 ConcurrentHashMap

1. HashMapConcurrentHashMap是线程安全的map,通过索引+synchroninzed的分段式锁实现线程安全。在java中hash的实现主要是数组+链表的方式,后来在JDK1.8之后如果数组元素多的情况下会采用数组+红黑树的方式,确定在数组中Index的方式是hash值与数组长度取余,在Java中为了速度更快采用hash&nodes.length。给定的默认容量为 16,负载因子为 0.75。Map 在使用过程中不断的往里面存放数据,当数量达到了 16 * .

2021-04-06 15:59:16 128

原创 深入理解Java虚拟机-Java内存区域与内存溢出异常

先一点点记录一下,后期会补一下全部的<<深入理解Java虚拟机>>目录Java内存区域与内存溢出异常 对于从事C,C++程序的开发人员来说,在内存管理区域,他们既是拥有最高权力的“皇帝”又是从事最基础工作的“劳动人民”,即拥有一个对象的所有权,又要负责每一个对象开始到结束的维护任务。 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不需要再为每一个new操作去写配对的delete/free代码, 不容易出现内存溢出问题,由虚拟机管理内存让这...

2021-01-21 16:17:30 109

原创 letcode每日一题-较大分组的位置

题目描述如下:其实这道题换个说法就是找到所有的连续的长度超过3的相同字符的子串,我们可以遍历该序列,并记录当前分组的长度。如果下一个字符与当前字符不同,或者已经枚举到字符串尾部,就说明当前字符为当前分组的尾部。每次找到当前分组的尾部时,如果该分组长度达到 33,我们就将其加入答案。代码实现如下:public List<List<Integer>> largeGroupPositions(String s) { List<List<In

2021-01-05 17:21:18 78

原创 leetcode每日一题-斐波那契数

快乐的元旦结束啦,继续回来刷题,先上题目描述这道题目比较简单,题中已经给了我们公式,我们想要知道F(n),只需要知道F(n-1)和F(n-2)即可,这里我们用value1存储F(n-1),value2存储F(n-2)即可,这时F(n)=value1+value2。在下一轮F(n+1)计算时,value1=value2,value2=F(n),代码实现如下: public int fib(int n) { int value1=0; int value2=1;

2021-01-04 14:42:22 110

原创 letcode每日一题-最后一块石头的重量

临近年底,工作增多了,少了好几天的,元旦补一下吧,先记录一下今天的:首先看到选出两块最重的石头,这种排前几的问题,使用堆排序是最好的,所以这里我们只需要每次用堆排序排除前两大 的石头,如果体积相等就跳过,如果不相等就把剩余的继续放入数组中即可,代码 实现如下:public int lastStoneWeight(int[] stones) { if(stones.length==1){ return stones[0]; }

2020-12-30 10:43:23 100

原创 二叉查找树的增删查

定义 二叉查找树(ADT)是一个具有对于树种的某个节点X,它的左节点都比X小,它的右节点都比X大的二叉树。如下就是一个符合要求的二叉查找树:增加节点1.定义节点类:class Node{ int val; Node left; Node right; public Node(int val){ this.val=val; }}2.插入元素 我们采用递归的方法: 1.判断与根节点是否相同,相...

2020-12-23 14:56:54 124

原创 leetcode每日一题-字符串中的第一个唯一字符

题目描述如下:要判断一个字符是否在字符串中出现过最先想到的就是哈希表,但是题目中有说了只包含小写字母所以,我们可以用数组代替哈希表,代码实现如下:public int firstUniqChar(String s) { char[] count = new char[26]; for (int i = 0; i < s.length(); i++) { count[s.charAt(i) - 'a']++; }

2020-12-23 10:23:07 124

原创 letcode每日一题-二叉树的锯齿形层序遍历

题目描述如下:我们只需要逐层防止到数组中,如果是奇数层就往数组开头位置插入,如果是偶数层就从末尾插入,代码实现如下:public List<List<Integer>> zigzagLevelOrder(TreeNode root) { bianli(root,0); return result; } public void bianli(TreeNode node,int zindex){ if(nod

2020-12-22 17:43:31 71

原创 letcode每日一题-使用最小花费爬楼梯

题目描述如下:方法一:动态规划在题中每一个阶梯只有两种情况即爬或者不爬,这里我们用一个数组dp存储阶梯的情况,dp[i][1]存储爬阶梯消耗的能量,dp[i][0]存储不爬消耗的能量,我们要知道第i层阶梯爬的所需消耗的最小能量,则 dp[i][0]=Math.min(dp[i-1][0]+cost[i],dp[i-1][1]+cost[i]);应为一次只能选择爬一阶或者两阶所以第i阶不爬的话,第i-1阶必须要爬,则: dp[i][1]=dp[i-1][1]最...

2020-12-21 10:32:50 130

原创 letcode每日一题-找不同

题目描述如下:这道题的类型是简单,但是解法上还是比较有意思 的,下面按照容易想到的程度说一下三种方法:方法一:计数法应为题目中说了s和t只包含小写字母,我们可以用一次长度为26的数组存储字符串S中各个字符出现的次数,如果t中的字符在数组中读出的出现次数为0,则是多出来的,代码实现如下:public char findTheDifference(String s, String t) { int[] chars=new int[26]; for(i

2020-12-18 14:59:11 128

原创 letcode每日一题-买卖股票的最佳时机含手续费

题目描述如下:我的解题思路: 我们假设先持有第1个股票,如果有有比之价格低的就持有价格低的股票,如果 有比之大且收益大于0的情况我们就走两个分支 :1.抛售现在持有的股票 2.不抛售现在持有的股票,然后选择相对较大的收益,以此类类推,代码实现如下: public int maxProfit(int[] prices, int fee) { return maxProfit(prices, fee,0,Integer.MAX_VALUE); } p..

2020-12-17 19:31:22 109

原创 数据结构-栈

栈定义限制插入和删除只能在表的末端进行操作,也就是栈顶进行操作。符合先进后出的特点。Java中栈的实现是 通过数组。例如:把1,2,3,4插入栈中,则存储结构如下:栈的简单应用-计算器代码如下:import java.util.Stack;/** * 实现带括号的四则运算 */public class CalculatorUtil { public static void main(String[] args) { System.out.pri

2020-12-16 20:13:30 198 2

原创 letcode每日一题-单词规律

题目描述如下:相关标签:哈希表解题思路:题目中说pattern与str存在着双向连接,就是任意一个字符都对应着唯一的字符串,这里我们可以使用两个 哈希表来判断是否存在着这个双向连接。我们可以利用哈希表记录每一个字符对应的字符串,以及每一个 字符串对应的字符。然后我们枚举每一对字符与字符串的配对过程,不断更新哈希表,如果发生了冲突, 则说明给定的输入不满足双射关系代码实现如下:pub...

2020-12-16 16:04:12 194

原创 letcode每日一题-单调递增的数字

题目描述如下: 根据题目的要求我们是要找出小于或等于N的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。方法一:当做数字处理+双向队列 应为我们没办法直接获得对应整数N的最高位,而能直接获得个位数(N%10),所以我们从个位开始处理,应为从最高位起是单调递增的,则从最最低位起应该是单调递减的,这样我们依次判断就好,如果符合递减就放入双向队列中,如果不符合则应该清空原数组,放入当前数值-1,应为如果当前数字不满足单调递减,则最大的就是当前数字-1,后...

2020-12-15 10:39:24 179

原创 Letcode每日一题-字母异位词分组

题目描述如下: 是否位字母异位词的判定标准是是否具有相同的字符,如何判断两个字符串具有相同的字符,一种方法是循环遍历,如果具有相同的字符则把对应的字符删除,依次循环,最后判断作为基准的字符串是否为空即可,这种比较麻烦,而且 效率太低。 另外一种办法是对这些字符进行排序,则排序后的两个字符串相同,则为字母异位词。 在这里题目中说所有输入均为 小写字母,则还有一种方法就是用一个长度位26的数组存储各个字母出现的字数,最后根据这个数组拼接字符串,如果拼接后的字符...

2020-12-14 19:33:10 100

原创 letcode每日一题- 柠檬水找零

原本是在博客园记录的,但是从今天起可能只能在csdn记录每日一题了。先上题目描述:要想进行找零,我们先要知道手里各种零钱的数量,比如顾客给10元,我们要知道手里5元的数量是否足够找零,如果给20元我们要先确定10元和5元的组合是否满足,不满足再找5元的,应为5元的适用度更好。这样我们的代码实现如下:public boolean lemonadeChange(int[] bills) { int five=0,ten=0; for(int i=0;i<bills

2020-12-10 10:09:18 74

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

1.定义 模板方法模式(Template Method Pattern)是定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 多个子类有公有的方法,并且逻辑基本相同时可以采用此方法,在父类中定义好实现不同的方法,实现逻辑相同的代码,避免代码重复出现。类图如下所示: 2.代码实现//模板...

2020-03-23 17:18:07 157

原创 建造者模式

1.定义 建造者模式(Builder Pattern)又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。使用者无需知道其具体的构建方式只需要知道要够贱的对象。 建造者模式与工厂模式的不同,建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者...

2019-12-18 10:19:21 127

原创 BitSet原理简介

1.定义 Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也都是位运算,每一位只用来存储0,1值,主要用于对数据的标记。可用于判断数据是否重复。2.实例 public static void main(String[] args) { String str="test"; String str2="test"; ...

2019-12-17 16:11:52 351

原创 工厂模式+抽象工厂模式

1.定义 工厂模式 抽象工厂模式 定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。 优点 用户只需要知道具体工厂的名称就可得到...

2019-12-17 09:56:25 137

原创 原型模式

1.定义 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。2.单例模式的结构与实现由于Java提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。1. 模式的结构原型模式包含以下...

2019-12-12 14:43:08 99

空空如也

空空如也

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

TA关注的人

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