![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 58
亦疏
别人都说我们是“搬砖”的码农,但我们知道自己是追求个性点艺术家。也许我们不会过多在意自己的外表和穿着,但在我们不羁的外表下,骨子追求着代码的美、系统的美、设计的美。
展开
-
史上最全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 · 22896 阅读 · 16 评论 -
使用CompletableFuture并发处理任务并将结果汇总
先说一下业务场景,在查询用户信息的时候需要顺便查询很多与用户相关的信息,这些信息都在不同的系统里面。每个信息都要查几个不同的表才能得到完整数据,相对比较耗时。伪代码如下:List<User> user = getUser();// 循环for(User u:user) { u.setXXX(//某信息查询结果); U.setXXX(//某信息查询结果);}解决方案也很简单,把顺序查询转为并发查询即可 ExecutorService executor = new Thre原创 2021-12-14 23:11:27 · 5103 阅读 · 0 评论 -
线程池实战(并发查询以及将结果汇总)
先说一下我遇到的问题。业务场景是需要一次性查出多种数据并汇总。这些数据来源有着各自的查询逻辑。如果顺序执行需要花费大量时间。所以想到了用线程池去处理。先上配置类和配置信息import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/** * @author Administrator */@Configura原创 2021-12-04 13:14:23 · 1456 阅读 · 0 评论 -
设计模式之策略模式+工厂模式+模板模式
前面的文章简单的实现了策略模式。今天进阶一下。依旧用打折的案例。普通用户八折,会员五折。话不多说,直接上代码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 · 1119 阅读 · 3 评论 -
并发编程实战从入门到精通(一)-线程的安全性
本专栏将带你从浅入深了解Java并发编程。持续更新中。。。要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享(Shared)和可变的(Mutable)状态的访问从非正式意义上来说,对象的状态是值存储在状态变量(例如实例或者静态域)中的数据。共享意味着变量可以由多个线程同时访问,而可变则意味着变量的值存在其生命周期内可以发生变化。当多个线程访问某个状态变量并且其中有一个线程执行写入操作的时候,必须采用同步机制来协同这些线程对变量的访问。Java中的主要同步机制是synchroniz原创 2021-11-28 01:04:58 · 120 阅读 · 0 评论 -
T31-DAY29(如何构建健壮性的系统)
前言T31给我带来的影响真的是太大了。讲的很多知识都感同身受,也运用到了实际的项目当中。最大的收获还是坚持,世界上有两种人,停滞不前的和终身前进的。系统的健壮性指的是系统在异常情况,特殊情况依然能够稳定运行的能力。在说构建健壮性的系统之前,先复习一下架构的目的是什么:1.确定系统边界2.确定后续的子系统或模块设计在一个既定的框架内和技术方向上继续演化的原则3.确定系统里各模块之间的依赖关系与模块的宏观输入与输出4.确定非功能性需求我们都知道千里之堤,溃于蚁穴。一个健壮性的系统离不开好的原创 2021-11-23 23:54:29 · 628 阅读 · 0 评论 -
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 · 505 阅读 · 0 评论 -
T31-DAY26(Redis分布式锁详解)
Redis分布式锁前面几篇文章已经介绍过了。现在就有通俗易懂的方式再来讲一遍。在进入正文之前,我们先带着问题去思考:什么时候需要分布式锁?加、解锁的代码位置有讲究么?如何避免出现死锁超时时间设置多少合适呢?如何避免锁被其他线程释放如何实现重入锁?主从架构会带来什么安全问题?什么是 Redlock……什么时候用分布式锁?这里借用码哥的一个描述精子喷射那一刻,亿级流量冲向卵子,只有一个精子能获得与卵子结合的幸运。造物主为了保证只有一个「精子」能获得「卵子」的宠幸,当有一个精子进入原创 2021-11-21 19:23:11 · 3505 阅读 · 0 评论 -
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 · 2886 阅读 · 0 评论 -
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 · 695 阅读 · 0 评论 -
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 · 670 阅读 · 0 评论 -
T31-DAY22(单元测试与系统安全规约)
认识单元测试单元测试是对软件组成单元进行的测试。其目的是检验软件基本组成单位的正确性。测试对象是软件设计的最小单元:模块,又称为模块测试。单元测试的AIR原则单元测试的BCDE原则功能性测试之边界值测试常用单元测试框架简介系统安全规约实践权限控制之越权访问漏洞越权访问(Broken AccessControl,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。越权访问漏洞防范措施水平越权访问漏洞水平越原创 2021-11-17 00:27:28 · 1171 阅读 · 0 评论 -
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 · 454 阅读 · 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 · 2383 阅读 · 0 评论 -
Java面试题(基础篇)
Java的要求现在是越来越高了。主要原因呢还是太卷,同样是 CURD 的活,谁更熟练要谁。不背点八股文真的很难过面试。每个问题我都做了详细版的回答和简答供大家参考。1.JDK动态代理和CGLIB动态代理的区别JDK动态代理和CGLIB动态代理的区别1.JDK动态代理只能对实现了接口的类生成代理,而不能针对类2.CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)2.静态代理和动态代理的区别静态代理和动态代理的区别1.静态代理中代理类在编译期就已经确定,而动原创 2021-11-14 21:39:50 · 242 阅读 · 0 评论 -
java中的static关键字
static注意事项1、静态只能访问静态。2、非静态既可以访问非静态的,也可以访问静态的。static应用场景因为static是被类的实例对象所共享,因此如果 某个成员变量是被所有对象所共享的,那么这 个成员变量就应该定义为静态变量 。因此比较常见的static应用场景有:1、修饰成员变量2、修饰成员方法3、静态代码块4、修饰类【只能修饰内部类也就是静态内 部类】5、静态导包static的独特之处1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量原创 2021-11-14 21:14:19 · 199 阅读 · 0 评论 -
T31-DAY19(SpringCloud OAuth2)
OAuth2是什么?OAuth2是目前最流行的授权协议,用来授权第三方应用,获取用户数据OAuth2四种授权模式为什么要用OAuth2?在我看来,每一种架构都是慢慢演变而产生的。先看看单体架构cookie session的认证机制可以看出弊端很明显。多个服务之间sesion不能共享,同步起来太麻烦了。成本也高。分布式架构方案1:session共享方案2:基于token这两者的区别:...原创 2021-11-13 22:55:08 · 409 阅读 · 0 评论 -
T31-DAY18(线程与线程池笔记)
放个图看看线程的几种状态线程可以拥有自己的操作栈,程序计数器,局部变量表等资源,它与同一进程内其他线程共享资源。线程池的作用:1.利用线程池管理并复用线程、控制最大并发数等2,增加对线程的管理,快速排查问题3.实现任务线程队列缓存策略和拒绝机制4.实现某些与时间相关的功能,如定时执行、周期执行等5,隔离线程环境比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明显要大;因此,通过配置独立的线程池,将较慢的交易服务与搜索服务隔离开,避免各服务线程相互影响。线程池相原创 2021-11-12 22:03:21 · 339 阅读 · 0 评论 -
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 · 441 阅读 · 0 评论 -
面试题: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 · 387 阅读 · 0 评论 -
面试题:重写和重载的区别是什么?
定义不同—重载是定义相同的方法名,参数不同;重写是子类重写父类的方法范围不同—重载是在一个类中,重写是子类与父类之间的多态不同—重载是编译时的多态性,重写是运行时的多态性返回不同—重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型参数不同—重载的参数个数、参数类型、参数顺序可以不同,而重写父子方法参数必须相同修饰不同—重载对访问修饰没有特殊要求,重写访问修饰符的限制一定要大于被重写方法的访问修饰符简单概况就是:重载是定义相同的方法名,参数不同,重写是子类重写父类的方法;重载是在一个类中原创 2021-11-08 16:36:08 · 261 阅读 · 0 评论 -
面试题:ArrayList和LinkedList有什么区别?(从源码进行分析)
ArrayList和LinkedList有什么区别?这题目是老八股文了。1.ArrayList和LinkedList的差别主要来自于Array和LinkedList数据结构的不同。 ArrayList是基于数组实现的,LinkedList是基于双链表实现的。另外LinkedList类不 仅是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之外, LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向 队列,因此LinkedList可以作为双向队列原创 2021-11-08 16:23:19 · 480 阅读 · 0 评论 -
静态代理和动态代理的区别
静态代理和动态代理的区别按照代理的创建时期,代理类可以分为两种:静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。动态:在程序运行时运用反射机制动态创建而成。静态代理类优缺点优点:代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合),对于如上的客户端代码,newUserManagerImpl()可以应用工厂将它隐藏。缺点:1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大原创 2021-11-08 15:42:30 · 3031 阅读 · 0 评论 -
动态代理:JDK动态代理和CGLIB代理的区别
在理解他们区别之前,首先要清楚什么是代理模式代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执行的是被代理类的方法。而AOP,是通过动态代理实现的。一、简单来说:JDK动态代理只能对实现了接口的类生成代理,而不能针对类CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)二、Spring在选择用JDK还是CGLiB的依据:(1)当Bean实现接口时,Spring就会用JDK的动态代理(2)当Bea原创 2021-11-08 15:25:43 · 538 阅读 · 1 评论 -
T31-DAY12(编码规约笔记)
今天上课让我回忆起来了很久之前踩过的一个坑。直接上图后端返回的值与前端不一致!这种情况我也是第一次遇到。当时的做法是把Long转换成了String类型传给前端。为什么会出现这种情况呢?原来Java 服务端如果直接返回 Long 整型数据给前端,JS 会自动转换为 Number 类型(注:此类型为双精度浮点数,表示原理与取值范围等同于 Java 中的 Double)。Long 类型能表示的最大值是 2 的 63 次方-1,在取值范围之内,超过 2 的 53 次方 (9007199254740992原创 2021-11-07 00:26:42 · 512 阅读 · 0 评论 -
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 · 127 阅读 · 0 评论 -
T31-DAY9分享(后端项目搭建)
T31-DAY9原创 2021-11-02 12:44:37 · 132 阅读 · 0 评论 -
T31-DAY10(技术架构选型)
为什么要进行技术选型?1.降低开发成本2.提升开发效率微服务架构的产生1.第一代单体应用优点:所有的模块打包到一起部署运行;例如打包一个War包放到一个Tomcat下运行,这种架构也叫巨石型应用架构,在开发小型项目上有独特优势:易于调试、部署,运维方便。缺点:1、不可靠。任何模块的一个bug,可能拖垮整个应用2、单维扩展。只能通过运行更多的服务器水平扩展,而不同的应用服务对资源的需求不同3、不可持续发展。引入新的框架或语言需要重构所有业务模块,往往需要在初期就选定技术栈2.SOA原创 2021-11-05 01:04:27 · 122 阅读 · 0 评论 -
T31-DAY8(工程结构规约)
文章目录一、应用分层二、二方库依赖三、服务器设定温故而知新,可以为师矣一、应用分层1.为什么要进行应用分层?• 隐藏下层业务逻辑的复杂性• 提高系统的组件化和可维护性(可维护性和扩展性)计算机领域的任何问题都可以通过增加一个中间层解决,下图是推荐分层模型2.分层异常处理DAO层:异常类型很多,不需要打印日志。Manager/Service:必须记录日志到磁盘,尽可能带上参数信息,保留案发现场。Web层:决不能将异常往上抛,应跳转到友好的提示页面,友好的错误提示信息开放接口层原创 2021-11-03 10:58:41 · 109 阅读 · 0 评论 -
@Async注解不生效,加上注解还是同步运行?看看这篇文章
前言在实际的项目中,对于一些用时比较长的代码片段或者函数,我们可以采用异步的方式来执行,这样就不会影响整体的流程了。比如我在一个用户请求中需要上传一些文件,但是上传文件的耗时会相对来说比较长,这个时候如果上传文件的成功与否不影响主流程的话,就可以把上传文件的操作异步化,在spring boot中比较常见的方式就是把要异步执行的代码片段封装成一个函数,然后在函数头使用@Async注解,就可以实现代码的异步执行(当然首先得在启动类上加上@EnableAsync注解了)。千万不要这样使用@Async注解先原创 2021-10-28 11:30:36 · 995 阅读 · 0 评论 -
关于监听器无法实例化bean的问题
在监听器通过@autowired注解加载bean时,遇到了空指针问题。长话短说。首先我们了解到,web.xml中的加载顺序为:listener >> filter >> servlet >> spring在不改变这个顺序的情况下。我的解决方案是手动实例化bean贴代码import org.springframework.aop.framework.AopContext;import org.springframework.beans.BeansException原创 2021-07-27 12:03:10 · 308 阅读 · 0 评论 -
MyBatis Plus AutoGenerator代码生成器入门
新建SpringBoot项目:加入Mybatis和MySql驱动,然后pom文件再加入以下依赖 com.baomidou mybatis-plus-generator 3.3.0 org.apache.velocity velocity-engine-core 2.1 org.freemarker freemarker ...原创 2019-12-19 19:40:46 · 142 阅读 · 0 评论 -
javaSE集合以及相关面试题概述
因为最近也要准备去实习了,所以顺带复习了一些java基础知识,希望对大家有帮助。本文只是集合的概述,介绍集合之间的关系,以及各种集合的异同,不会深入介绍具体的实现1. java集合概述集合,说白了就是存放数据的,话不多说,先上图。在图中,可以看到Collection有两个子接口,List和Set,其中List集合主要实现类有ArrayList,LinkedList和Vector.它是有...原创 2019-11-18 23:24:43 · 138 阅读 · 0 评论 -
SpringBoot实现文件上传
新建一个项目依赖这里勾上web就可以了在src/main下新建一个webapp文件路径选webapp下在web-inf下新建一个jsp文件把猫加进来把项目加进来可以配置视图解析器的前缀和后缀我们需要添加web模板支持,所以要添加spring-boot-starter-web由于我们在JSP页面需要使用JSP标签库,所以要加入JSTL标签库依赖War包部署...原创 2019-11-17 23:03:23 · 261 阅读 · 0 评论