自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 史上最全idea插件开发入门实战(傻瓜式教程)

idea插件开发入门实战文章目录idea插件开发入门实战前言一、书写第一个Hello World二、IDEA插件开发进阶1.基于java文件的规则校验2.基于XML文件规则的校验3.基于java文件的代码自动生成方法4.基于XML文件的读写方法前言建议先看一遍官方文档再开始IDEA插件开发官方文档一、书写第一个Hello World新建项目完事之后先修改plugin.xml配置文件。<idea-plugin> <id>com.yishu.plugin&l

2022-03-28 16:10:06 21498 16

原创 最新JDK17安装步骤(傻瓜式安装)

下载链接:https://download.oracle.com/java/17/archive/jdk-17.0.1_windows-x64_bin.exe也可以进官网选择这里选择安装到其他磁盘。我在E盘建了一个JAVA目录比起旧版本。安装速度真的快了很多。然后是设置环境变量。1.在我的电脑->高级系统设置新建变量 JAVA_HOME,变量值为 E:\Java2.新建CLASSPATH 变量值为 %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\to

2021-11-26 16:18:03 24512 5

原创 T31-DAY26(Redis分布式锁详解)

Redis分布式锁前面几篇文章已经介绍过了。现在就有通俗易懂的方式再来讲一遍。在进入正文之前,我们先带着问题去思考:什么时候需要分布式锁?加、解锁的代码位置有讲究么?如何避免出现死锁超时时间设置多少合适呢?如何避免锁被其他线程释放如何实现重入锁?主从架构会带来什么安全问题?什么是 Redlock……什么时候用分布式锁?这里借用码哥的一个描述精子喷射那一刻,亿级流量冲向卵子,只有一个精子能获得与卵子结合的幸运。造物主为了保证只有一个「精子」能获得「卵子」的宠幸,当有一个精子进入

2021-11-21 19:23:11 3477

原创 谈谈SOA架构和微服务,以及两者的区别区别

众所周知,任何架构都是一步步演变而来的。没有最好的架构,只有最合适的架构。先来看看第一代单体应用,我想这个大家也是很熟悉。大部分人入门也是从单体应用开始的。第一代单体应用架构这里放一个图,图中可以看到,所有模块都打包到一起,并且公用一个数据库。这种架构就是单体应用架构,也叫巨石应用。在开发小型项目上有独特的优势,易于调试、部署、运维方便,给个人开发应用的时候是比较合适的。同样,缺点也是很明显的,第一就是不可靠,一旦某个模块出现问题,可能会拖垮整个应用。然后扩展也很不方便,只能通过运行更多的服务器来进

2021-12-18 20:22:09 1595

原创 使用CompletableFuture并发处理任务并将结果汇总

先说一下业务场景,在查询用户信息的时候需要顺便查询很多与用户相关的信息,这些信息都在不同的系统里面。每个信息都要查几个不同的表才能得到完整数据,相对比较耗时。伪代码如下:List<User> user = getUser();// 循环for(User u:user) { u.setXXX(//某信息查询结果); U.setXXX(//某信息查询结果);}解决方案也很简单,把顺序查询转为并发查询即可 ExecutorService executor = new Thre

2021-12-14 23:11:27 4597

原创 线程池实战(并发查询以及将结果汇总)

先说一下我遇到的问题。业务场景是需要一次性查出多种数据并汇总。这些数据来源有着各自的查询逻辑。如果顺序执行需要花费大量时间。所以想到了用线程池去处理。先上配置类和配置信息import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/** * @author Administrator */@Configura

2021-12-04 13:14:23 1389

原创 设计模式之策略模式+工厂模式+模板模式

前面的文章简单的实现了策略模式。今天进阶一下。依旧用打折的案例。普通用户八折,会员五折。话不多说,直接上代码1.来一个用户类的枚举public enum UserTypeEnum { USER,MEMBER;}2.接着来一个注解类@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface PersionType { UserTypeEnum type();}3.策略接口

2021-12-01 22:03:15 1090 3

原创 T31-DAY31(课程总结)

豪不夸张的说,t31是我内卷的开始,从毕业到现在有一年半了,回顾一下,毕业的前半年处于躺平的状态。后面出于对于现状的不满意,开始了主动学习,但是总是学一段时间停一段时间。就这样又过了半年,收获大概就是数据结构和算法相关的知识、jvm等。再后面开始学习spring等各种源码。接着就报名了t31课程。说来也巧,也就是那段时间朋友圈很多优秀的人也感染着我,比如有坚持每天早起打卡跑步的,坚持每天阅读的等等。同样t31也是需要坚持每天分享的。于是我在这段时间也学会了早起运动(想减掉这一年来飙升的体重),坚持每天学习,

2021-11-30 22:32:54 174

原创 并发编程实战从入门到精通(一)-线程的安全性

本专栏将带你从浅入深了解Java并发编程。持续更新中。。。要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享(Shared)和可变的(Mutable)状态的访问从非正式意义上来说,对象的状态是值存储在状态变量(例如实例或者静态域)中的数据。共享意味着变量可以由多个线程同时访问,而可变则意味着变量的值存在其生命周期内可以发生变化。当多个线程访问某个状态变量并且其中有一个线程执行写入操作的时候,必须采用同步机制来协同这些线程对变量的访问。Java中的主要同步机制是synchroniz

2021-11-28 01:04:58 117

原创 T31-DAY29(如何构建健壮性的系统)

前言T31给我带来的影响真的是太大了。讲的很多知识都感同身受,也运用到了实际的项目当中。最大的收获还是坚持,世界上有两种人,停滞不前的和终身前进的。系统的健壮性指的是系统在异常情况,特殊情况依然能够稳定运行的能力。在说构建健壮性的系统之前,先复习一下架构的目的是什么:1.确定系统边界2.确定后续的子系统或模块设计在一个既定的框架内和技术方向上继续演化的原则3.确定系统里各模块之间的依赖关系与模块的宏观输入与输出4.确定非功能性需求我们都知道千里之堤,溃于蚁穴。一个健壮性的系统离不开好的

2021-11-23 23:54:29 594

原创 T31-DAY28(策略模式+单例模式+工厂模式实战)

这次我们拿购物举例子。我们知道不同的身份会对应不同的折扣。比如普通用户不打折,会员打五折。这样就会有一个打折策略public interface DiscountStrategy { Integer discount(Integer price);}另外,不同的用户我们这里用枚举类来表示public enum UserEnum { /** * 普通用户 */ USER("USER","com.example.demo.strategyDemo.Us

2021-11-22 21:05:56 488

原创 T31-DAY27(一周总结)

年少时期,我以为自己是世界的中心,自认为会成就一番大事业,最终却发现平庸才是真相,很多事情无论你怎么努力,都可能没有任何收获,慢慢的开始陷入绝望,陷入自我怀疑。但平庸不意外着失败,更不意外着要放弃理想和梦想。这个世界的每一个人起点是不一样的,机遇更是千差万别。回顾近来的半年,我越来越觉得“傻逼定律”是真的。这个定律最先是雷·达里奥提出的:如果你现在不觉得一年前的自己是个蠢货,那说明你这一年没学到什么东西。第一次看见这句话的时候,我觉的这就是在扯犊子,直到自己真的踏入飞速成长的状态,再回看这句话:真的说的太

2021-11-21 22:17:53 327

原创 T31-DAY24(Redis分布式锁)

Redis分布式锁原理Redis分布式锁机制,主要借助setnx和expire两个命令完成。1. setnx命令:SETNX 是SET if not exists的简写。将 key 的值设为 value,当且仅当 key 不存在; 若给定的 key 已经存在,则 SETNX 不做任何动作。下面为客户端使用示例:127.0.0.1:6379> set lock "unlock"OK127.0.0.1:6379> setnx lock "unlock"(integer) 0127.

2021-11-20 22:32:11 2828

原创 T31-DAY25(Redisson分布式锁)

作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。目前大家使用的最多的第三方库是jedis。和SpringCloud gateway一样,Redisson也是基于Netty实现的,是更高性能的第三方库。 所以,这里推荐大家使用Redission替代 jedis。Redisson简介Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还实现了可重入锁(R

2021-11-20 22:08:46 669

原创 T31-DAY23(JWT实战)

前面已经介绍了JWT,接下来进入实战环节1. 生成密钥证书 下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥创建一个文件夹,在该文件夹下执行如下命令行:keytool -genkeypair -alias kaikeba -keyalg RSA -keypass kaikeba -keystore kaikeba.jks -storepass kaikeba-alias:密钥的别名-keyalg:使用的hash算法-keypass:密钥的访问密码-keystore:密钥库文件名

2021-11-19 00:31:53 644

原创 T31-DAY22(单元测试与系统安全规约)

认识单元测试单元测试是对软件组成单元进行的测试。其目的是检验软件基本组成单位的正确性。测试对象是软件设计的最小单元:模块,又称为模块测试。单元测试的AIR原则单元测试的BCDE原则功能性测试之边界值测试常用单元测试框架简介系统安全规约实践权限控制之越权访问漏洞越权访问(Broken AccessControl,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。越权访问漏洞防范措施水平越权访问漏洞水平越

2021-11-17 00:27:28 1142

原创 T31-DAY21(ReentrantLock可重入锁介绍以及源码解析)

1.ReentrantLock类结构从图中可以看到ReentrantLock实现了Lock接口,在ReentrantLock中有非公平锁(NonfairSync)和公平锁(FairSync)都实现,NonfairSync和FairSync都继承自抽象类Sync。Sync类是ReentrantLock的内部抽象类,继承自抽象类AbstractQueuedSynchronizer(简称AQS)。如果大家看过JUC的源码,会发现不仅仅重入锁用到了AQS,JUC中绝大部分都同步工具也都是基于AQS构建的,Ree

2021-11-16 23:48:17 426 1

原创 T31-DAY20(JWT的介绍和使用)

JWTJWT组成Header头部{"alg": "HS256","typ": "JWT"}它会使⽤ Base64 编码组成 JWT 结构的第⼀部分Payload负载这部分就是我们存放信息的地⽅了,你可以把⽤户 ID 等信息放在这⾥,JWT 规范⾥⾯对这部分有进⾏了⽐较详细的介绍,常⽤的由 iss(签发者),exp(过期时间),su(⾯向的⽤户),aud(接收⽅),iat(签发时间)。{"iss": "lion1ou JWT","iat": 1441593502,"exp": 1

2021-11-14 23:13:01 2188

原创 Java面试题(基础篇)

Java的要求现在是越来越高了。主要原因呢还是太卷,同样是 CURD 的活,谁更熟练要谁。不背点八股文真的很难过面试。每个问题我都做了详细版的回答和简答供大家参考。1.JDK动态代理和CGLIB动态代理的区别JDK动态代理和CGLIB动态代理的区别1.JDK动态代理只能对实现了接口的类生成代理,而不能针对类2.CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)2.静态代理和动态代理的区别静态代理和动态代理的区别1.静态代理中代理类在编译期就已经确定,而动

2021-11-14 21:39:50 237

原创 java中的static关键字

static注意事项1、静态只能访问静态。2、非静态既可以访问非静态的,也可以访问静态的。static应用场景因为static是被类的实例对象所共享,因此如果 某个成员变量是被所有对象所共享的,那么这 个成员变量就应该定义为静态变量 。因此比较常见的static应用场景有:1、修饰成员变量2、修饰成员方法3、静态代码块4、修饰类【只能修饰内部类也就是静态内 部类】5、静态导包static的独特之处1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量

2021-11-14 21:14:19 197

原创 T31-DAY19(SpringCloud OAuth2)

OAuth2是什么?OAuth2是目前最流行的授权协议,用来授权第三方应用,获取用户数据OAuth2四种授权模式为什么要用OAuth2?在我看来,每一种架构都是慢慢演变而产生的。先看看单体架构cookie session的认证机制可以看出弊端很明显。多个服务之间sesion不能共享,同步起来太麻烦了。成本也高。分布式架构方案1:session共享方案2:基于token这两者的区别:...

2021-11-13 22:55:08 384

原创 T31-DAY18(线程与线程池笔记)

放个图看看线程的几种状态线程可以拥有自己的操作栈,程序计数器,局部变量表等资源,它与同一进程内其他线程共享资源。线程池的作用:1.利用线程池管理并复用线程、控制最大并发数等2,增加对线程的管理,快速排查问题3.实现任务线程队列缓存策略和拒绝机制4.实现某些与时间相关的功能,如定时执行、周期执行等5,隔离线程环境比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明显要大;因此,通过配置独立的线程池,将较慢的交易服务与搜索服务隔离开,避免各服务线程相互影响。线程池相

2021-11-12 22:03:21 336

原创 T31-DAY17(hashMap扩容算法)

在说扩容之前,首先问个问题。 new HashMap<>(13);在构造方法传入13的时候,hashMap初始化的容量是多少呢?答案是16先来看看JDK8的算法。我觉得JDK8的算法是比较好理解的1.JDK8 //MAXIMUM_CAPACITY=1<<30 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1;

2021-11-12 21:29:18 422

原创 T31-DAY14(浮点数在计算机中的存储)

单精度浮点数float占用32bit,符号位(1)+指数位(8)+位数部分(23)双精度浮点数double占用64bit,符号位(1)+指数位(11)+位数部分(52)一般情况下,浮点数的表示有一下几个要点:1、要规格化(让浮点数表示结果唯一),因为100=10^2 = 0.1 * 10^3, 所以第一步要统一地规格化,确定“阶数”和“尾数”(尾数在0.5-1之间,也就是二进制的0.1-1.0之间)2、“阶码”一般用“移码”表示法,而“尾数”一般用“原码/补码表示法,“数符”表示浮点数

2021-11-11 00:28:55 217

原创 T31-DAY16(车次管理实现)

popackage com.kkb.t31.po;import com.baomidou.mybatisplus.annotation.TableName;import com.kkb.t31.core.po.BaseEntity;import lombok.Data;import java.util.Date;/** * @author Akily */@TableName("train_number")@Datapublic class TrainNumber extend

2021-11-11 00:19:23 164 1

原创 T31-DAY15(Java代码避坑指南)

1.浮点数处理使用 java.text.DecimalFormat进行值比较2.日期类型处理Java中传统日期类型Date:表示特定的瞬间,精确到毫秒SimpleDateFormat:对日期格式化传统日期API问题1.所有的日期类型都是线程不安全的2.日期,时间,时间戳没有明确对应的类3.对于格式化和解析的需求JDK8新增API的优势1.线程安全2.时间和日期都有相应的类3.在所有的类中,方法都被明确定义以完成相同的行为4.所有新的日期、时间API类都实现了一系列通

2021-11-09 22:07:01 411

原创 面试题:Java 8的接口新增了哪些特性?

在jdk1.8以前接⼝中,只能有抽象方法,不能有任何方法的实现(方法体)。而在jdk1.8中打破常规,引⼊了新的关键字default,在接口中使⽤default修饰的方法,可以在接口里编写方法体。1.新增了默认方法(default)public interface Animal { void sleep(); default void eat(){ System.out.println("吃"); }}2.静态方法(static)可直接

2021-11-08 16:50:30 382

原创 面试题:重写和重载的区别是什么?

定义不同—重载是定义相同的方法名,参数不同;重写是子类重写父类的方法范围不同—重载是在一个类中,重写是子类与父类之间的多态不同—重载是编译时的多态性,重写是运行时的多态性返回不同—重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型参数不同—重载的参数个数、参数类型、参数顺序可以不同,而重写父子方法参数必须相同修饰不同—重载对访问修饰没有特殊要求,重写访问修饰符的限制一定要大于被重写方法的访问修饰符简单概况就是:重载是定义相同的方法名,参数不同,重写是子类重写父类的方法;重载是在一个类中

2021-11-08 16:36:08 247

原创 面试题:ArrayList和LinkedList有什么区别?(从源码进行分析)

ArrayList和LinkedList有什么区别?这题目是老八股文了。1.ArrayList和LinkedList的差别主要来自于Array和LinkedList数据结构的不同。 ArrayList是基于数组实现的,LinkedList是基于双链表实现的。另外LinkedList类不 仅是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之外, LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向 队列,因此LinkedList可以作为双向队列

2021-11-08 16:23:19 457

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

静态代理和动态代理的区别按照代理的创建时期,代理类可以分为两种:静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。动态:在程序运行时运用反射机制动态创建而成。静态代理类优缺点优点:代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合),对于如上的客户端代码,newUserManagerImpl()可以应用工厂将它隐藏。缺点:1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大

2021-11-08 15:42:30 2987

原创 动态代理:JDK动态代理和CGLIB代理的区别

在理解他们区别之前,首先要清楚什么是代理模式代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执行的是被代理类的方法。而AOP,是通过动态代理实现的。一、简单来说:JDK动态代理只能对实现了接口的类生成代理,而不能针对类CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)二、Spring在选择用JDK还是CGLiB的依据:(1)当Bean实现接口时,Spring就会用JDK的动态代理(2)当Bea

2021-11-08 15:25:43 529 1

原创 T31-DAY13(感悟分享)

上孤尽老师的课已经2周了,每次上完课都有一种今天的自己比昨天更加优秀的感觉。越是上到后面越是觉得编码规范真的是非常非常重要,我现在接手的项目就是那种结构混乱的项目,什么排查问题困难,维护困难等各类问题都遇到了。目前也在致力于推动平台的代码规范问题。另外上课还让我感受最深的是孤尽老师的坚持和对技术的热爱。这样的人优秀绝对不是偶然,而是必然。这份精神也影响着我,我也在坚持着做一些事情,比如每天早起晨跑,每天坚持学习并且分享。为了挤出时间把每天起床的时间从9点提早到了6点。虽然我知道这对于很多人来说这只是他们的日

2021-11-07 22:49:04 83

原创 T31-DAY12(编码规约笔记)

今天上课让我回忆起来了很久之前踩过的一个坑。直接上图后端返回的值与前端不一致!这种情况我也是第一次遇到。当时的做法是把Long转换成了String类型传给前端。为什么会出现这种情况呢?原来Java 服务端如果直接返回 Long 整型数据给前端,JS 会自动转换为 Number 类型(注:此类型为双精度浮点数,表示原理与取值范围等同于 Java 中的 Double)。Long 类型能表示的最大值是 2 的 63 次方-1,在取值范围之内,超过 2 的 53 次方 (9007199254740992

2021-11-07 00:26:42 485

原创 T31-DAY11(通用代码编写)

1.通用树形结构BaseTreeEntity@Data@JsonIgnoreProperties(value = {"handler"})public class BaseTreeEntity extends BaseEntity { /** * 排序字段 */ @TableField("`order`") private Integer order; /** * ⽗节点id */ @TableField("`parent

2021-11-06 18:59:43 118

原创 T31-DAY10(技术架构选型)

为什么要进行技术选型?1.降低开发成本2.提升开发效率微服务架构的产生1.第一代单体应用优点:所有的模块打包到一起部署运行;例如打包一个War包放到一个Tomcat下运行,这种架构也叫巨石型应用架构,在开发小型项目上有独特优势:易于调试、部署,运维方便。缺点:1、不可靠。任何模块的一个bug,可能拖垮整个应用2、单维扩展。只能通过运行更多的服务器水平扩展,而不同的应用服务对资源的需求不同3、不可持续发展。引入新的框架或语言需要重构所有业务模块,往往需要在初期就选定技术栈2.SOA

2021-11-05 01:04:27 94

原创 T31-DAY8(工程结构规约)

文章目录一、应用分层二、二方库依赖三、服务器设定温故而知新,可以为师矣一、应用分层1.为什么要进行应用分层?• 隐藏下层业务逻辑的复杂性• 提高系统的组件化和可维护性(可维护性和扩展性)计算机领域的任何问题都可以通过增加一个中间层解决,下图是推荐分层模型2.分层异常处理DAO层:异常类型很多,不需要打印日志。Manager/Service:必须记录日志到磁盘,尽可能带上参数信息,保留案发现场。Web层:决不能将异常往上抛,应跳转到友好的提示页面,友好的错误提示信息开放接口层

2021-11-03 10:58:41 85

原创 T31-DAY9分享(后端项目搭建)

T31-DAY9

2021-11-02 12:44:37 104

原创 T31项目-Day6分享

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码

2021-11-01 00:48:17 110

原创 工作中该如何去跳槽

前言成长是苦涩的,没有舒舒服服的成功,不要抱怨,如果觉得命运不公平,那就改变命运,但是先从改变自己开始。为什么牛逼的职场人,都要花4个月找工作?问个问题:你会花多长时间准备一次跳槽?每次跳槽,我认为至少要花3-4个月的时间去准备,保证自己够到当下能够到的最高点。关于跳槽这件事,我和我的leader也聊到过,我们一致认为,要么不跳槽,要跳就要跳出高度。看了很多人跳槽的案例,我发现,大部分人跳槽的方式特别简单粗暴:3天改简历→一周海投+面试→选择薪资最高的offer入职,1个月都用不了。会考虑岗

2021-10-31 10:03:52 181

原创 T31项目-Day5分享(异常处理和日志规约)

道路千万条,安全第一条。日志不规范,排查两行泪。前言作为一个程序员,要对自己的代码有信心,稳定的代码块不应该放入tyr catch块。因为try catch 就需要moniter enter和moniter exit一、异常处理设计与实践?生成异常->捕获异常->抛出异常->声明异常1.异常抛出与捕获的原则(1) 非必要不使用异常(2)使用描述性消息抛出异常(3)力所能及的异常一定要处理(4)异常忽略要有理有据2.java异常体系try…catch…finall

2021-10-30 22:54:59 110

空空如也

空空如也

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

TA关注的人

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