Java
文章平均质量分 83
Janson_Lin
前中科院开发工程师!
展开
-
之前写参数校验(Validator),差点被劝退...
为什么要用validator javax.validation的一系列注解可以帮我们完成参数校验,免去繁琐的串行校验 不然我们的代码就像下面这样: //http://localhost:8080/api/user/save/serial/***走串行校验**@paramuserVO*@return*/@PostMapping("/save/serial")publicObjectsa...转载 2022-01-07 10:24:45 · 387 阅读 · 0 评论 -
volatile 关键字,你真的理解吗?
volatile 的作用大家都应该知道 volatile 的主要作用有两点: - 保证变量的内存可见性 - 禁止指令重排序那么,什么是内存可见性,什么是指令重排序,以及它们涉及了那些机制呢?下面就让我们来看看吧。在这里提醒一下,各位小伙伴要有个心理准备,就一个 volatile 关键字所涉及的知识点超乎你的想象哟。可见性问题在理解 volatile 的内存可见性前,我们先来看看这个比较常见的多线程访问共享变量的例子。/** * 变量的内存可见性例子 * * @author s转载 2021-10-14 14:44:00 · 165 阅读 · 0 评论 -
Java线程池 ExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类
Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService。利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池。下面我们分别介绍一下这三个类。Java线程池ExecutorService继承树:1、ExecutorService介绍ExecutorService是Java中对线.原创 2021-10-13 20:42:18 · 1865 阅读 · 0 评论 -
HandlerInterceptor中的preHandle、postHandle与afterCompletion
HandlerInterceptor简介拦截器我想大家都并不陌生,最常用的登录拦截、或是权限校验、或是防重复提交、或是根据业务像12306去校验购票时间,总之可以去做很多的事情。我仔细想了想这里我分三篇博客来介绍HandlerInterceptor的使用,从基本的使用、到自定义注解、最后到读取body中的流解决无法多次读取的问题。1、定义实现类定义一个Interceptor 非常简单方式也有几种,我这里简单列举两种1、类要实现Spring 的HandlerInterceptor 接口2、原创 2021-09-23 09:12:36 · 2460 阅读 · 0 评论 -
【NIO】Java NIO知识汇总(详细)
一、Java NIO 概述Java NIO 由以下几个核心部分组成:Channels Buffers Selectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。Channel 和 Buffer基本上,所有的 IO 在NIO 中都从一个Chann原创 2021-08-27 14:29:54 · 274 阅读 · 0 评论 -
websocket+netty实时视频弹幕交互功能(Java版)
2021年了,还有不支持弹幕的视频网站吗,现在各种弹幕玩法层出不穷,抽奖,ppt都上弹幕玩法了,不整个弹幕都说不过去了,今天笔者就抽空做了一个实时视频弹幕交互功能的实现,不得不说这样的形式为看视频看直播,讲义PPT,抽奖等形式增加了许多乐趣。1 技术选型1.1 netty官方对于netty的描述:https://netty.io/主要关键词描述:netty是异步事件驱动网络框架,可做各种协议服务端,并且支持了FTP,SMTP,HTTP等很多协议,并且性能,稳定性,灵活性都很棒。转载 2021-08-25 09:14:26 · 289 阅读 · 0 评论 -
你知道,JDK里有机器人吗
Java中Robot类位于java.awt.Robot,该类用于为测试自动化,自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件,Robot类的主要目的是便于Java平台实现自动测试。Robot可以模拟鼠标和键盘的输入,相当于Java版的按键精灵。给大家介绍下Jdk里很少用到的一个“机器人”类库-Robot。核心就是自动化;...原创 2021-06-08 09:59:05 · 201 阅读 · 1 评论 -
深入解析SpringAOP源码
一、认识AOP及其使用二、AOP的特点2.1 Spring AOP2.1.1 他是基于动态代理实现的Spring 提供了很多的实现AOP的方式:Spring 接口方式,schema配置方式和注解的方式. 如果使用接口方式引入AOP, 就是用JDK提供的动态代理来实现.如果没有使用接口的方式引入. 那么就是使用CGLIB来实现的研究使用接口方式实现AOP, 目的是为了更好地理解spring使用动态代理实现AOP的两种方2.1.2 Spring提供了对AspectJ的支持, 但只提原创 2021-04-22 14:54:50 · 635 阅读 · 0 评论 -
高并发情况下,雪花ID一秒400W个,以及分布式ID算法(详析)
背景最近在研究雪花算法,在研究同时,想了一个问题,在高并发的情况下,一秒内,雪花算法能生成多少个ID。闲话少说,开撸。https://blog.csdn.net/weixin_43876121/article/details/107744260?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242https://blog.csdn.net/lairikeq.原创 2021-04-22 10:22:40 · 3899 阅读 · 0 评论 -
Java中的<< 和 >> 和 >>> 详细分析
<<表示左移移,不分正负数,低位补0; 注:以下数据类型默认为byte-8位左移时不管正负,低位补0正数:r = 20 << 2 20的二进制补码:0001 0100 向左移动两位后:0101 0000 结果:r = 80负数:r = -20 << 2 -20 的二进制原码 :1001 0100 -20 的二进制反码:1110 1011 -20 的二进制补码 :1110 1100 左移两位后的补码:...转载 2021-04-22 09:55:45 · 198 阅读 · 0 评论 -
JVM 运行时内存以及转换情况
JVM 运行时内存Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和老年代。2.3.1. 新生代是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、 ServivorFrom、 ServivorTo 三个区。2.3.1.1. Eden 区Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年原创 2021-03-18 09:30:47 · 159 阅读 · 0 评论 -
浅析VO、DTO、DO、PO的概念、区别和用处
本篇文章主要讨论一下我们经常会用到的一些对象:VO、DTO、DO和PO。由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念:概念:VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提.转载 2020-12-15 16:44:28 · 219 阅读 · 1 评论 -
带你剖析spring-session续篇
上一篇文章中介绍了Spring-Session的核心原理,Filter,Session,Repository等等,传送门:带你剖析spring-session。这篇继上一篇的原理逐渐深入Spring-Session中的事件机制原理的探索。众所周知,Servlet规范中有对HttpSession的事件的处理,如:HttpSessionEvent/HttpSessionIdListener/HttpSessionListener,可以查看Package javax.servlet在Spring-Sess原创 2020-10-21 11:02:00 · 1321 阅读 · 0 评论 -
带你剖析spring-session
前言在开始spring-session揭秘之前,先做下热脑(活动活动脑子)运动。主要从以下三个方面进行热脑:为什么要spring-session 比较traditional-session方案和spring-session方案 JSR340规范与spring-session的透明继承一.为什么要spring-session在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。浏览器使用cookie中记录sessionId,容器根据ses原创 2020-10-21 10:57:28 · 808 阅读 · 0 评论 -
POI excel添加数据有效性验证以及解决DataValidation超长的问题
背景业务功能的需要,要求要去生产一个带有数据校验的导入模板。了解工具XSSFDataValidationConstraint(XSSF数据有效性验证约束):创建约束的时候,可以指定数据类型,以及数据列。例如:String strFormula = hiddenSheetName + "!$"+colStr+"$1:$"+colStr+"$65535"; XSSFDataValidationConstraint constraint = new XSSFDat原创 2020-09-03 11:54:45 · 11821 阅读 · 1 评论 -
Java文件类操作【工具类】
上一篇博客【SMB协议的共享文件读写】刚刚出,有位朋友私信,有没有普通的文件类的操作。下面贴出一下自己以前整理过的一些文件类的操作。import java.io.*;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.HashSet;import java.util.List;/** * @ Author原创 2020-09-03 11:18:34 · 166 阅读 · 0 评论 -
SMB协议的共享文件读写
背景介绍一、SMB协议SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445。服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。 SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以原创 2020-09-03 11:06:09 · 8609 阅读 · 0 评论 -
带你玩转RestTemplate
在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是,用起来最方便、最优雅的还是要属Feign了。这里介绍的是RestTemplate。什么是RestTemplate?RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远原创 2020-08-31 11:15:28 · 656 阅读 · 0 评论 -
你知道 volatile 关键字吗
volatile关键字基本介绍volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchronized可见性的特性,但没有synchronized原子性的特性。可见性即用volatile关键字修饰的成员变量表明该变量不存在工作线程的副本,线程每次直接都从主内存中读取,每次读取的都是最新的值,这也就保证了变量对其他线程的可见性。另外,使用volatile还能确保变量不能被重排序,保证了有序性。原创 2020-08-17 16:13:06 · 120 阅读 · 0 评论 -
手把手教你使用命令替换jar包中的class文件
一、背景在有时候,我们没有对应的源码,但是需要去改动我们所知jar包中的内容,这时,我们可以通过修改jar包中的class文件,从而使改包中的功能满足我们的开发需求。二、准备准备好你需要的jar包以及需要替换的 .class文件,我这里的class是通过解压jar包出来之后,创建了它们所对应的类之后,进行的编译,现在要替换这个jar包中的两个class文件三、了解jar的命令-c 创建一个jar包-t 显示jar中的内容列表-x 解压jar包-m 指定manifest.mf文原创 2020-07-14 15:24:55 · 6231 阅读 · 0 评论 -
带你快速上手Optional
1.前言相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨,有大佬说过“防止 NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常)2.认识Optional并使用简单来说,Opitonal类就是Java提供的为了解决大家平时判断对象是否为空用 会用 null原创 2020-07-07 09:46:22 · 208 阅读 · 0 评论 -
告诉你Java 集合框架
Java 集合,也称作容器,主要是由两大接口 (Interface)派生出来的:Collection 和 Map顾名思义,容器就是用来存放数据的。那么这两大接口的不同之处在于: Collection 存放单一元素; Map 存放 key-value 键值对。 就是单身狗放 Collection 里面,couple 就放 Map 里。(所以你属于哪里?学习这些集合框架,我认为有 4 个目标: 明确每个接口和类的对应关系; 对每个接口和类,熟悉常用的 API...原创 2020-07-06 09:55:05 · 266 阅读 · 0 评论 -
JAVA 泛型中的通配符 ’T,E,K,V,?‘是什么
前言Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型带来的好处在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行...原创 2020-06-29 09:55:37 · 284 阅读 · 0 评论 -
Java轻松的AES加密解密工具
1、背景在开发过程中,设置公用第三方可调用接口,如果通过http发起请求,参数等会是明文的方式,这里为了防止被爆破开放接口,我这里采用了明文加密传输的方式。2、AES是什么高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。那么为什么原来的DES会被取代呢,,原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、和256位密钥,并且用128位分组原创 2020-06-29 09:52:02 · 1160 阅读 · 0 评论 -
【Nacos】 windows版下载使用(一)
Nacos官网:https://nacos.io/zh-cn/一.下载(linux/windows版):https://github.com/alibaba/nacos/releases这里一般下载比较慢这里提供百度云链接:https://pan.baidu.com/s/1gXK5jh99jmC2NbGcoFC-Fw 提取码: v297二、解压三、启动进入bin,有startup.cmd时启动脚本,shutdown.cmd是停止脚本。启动成功。四、查看.原创 2020-06-03 16:25:18 · 1745 阅读 · 0 评论 -
SpringBoot 基于注解全局日期格式化
目录前言教程小结前言根据官方文档Custom JSON Serializers and Deserializers,想要接管Jackson的JSON的序列化和反序列化,只需通过注解@JsonComponent来声明其静态内部类即可。教程首先根据项目要求提供自定义的日期序列化器和反序列化器,其中包括: DateJsonSerializerextendsJsonSerializer<Date>表示将Date格式化为日期字符串。 DateJ...原创 2020-05-19 15:18:47 · 345 阅读 · 0 评论 -
SpringBoot停止服务的几种优雅姿态
在使用Spring Boot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭。而且一些没有执行完的程序就会直接退出。我们很多时候都需要安全的将服务停止,也就是把没有处理完的工作继续处理完成。比如停止一些依赖的服务,输出一些日志,发一些信号给其他的应用系统,这个在保证系统的高可用是非常有必要的。那么咱们就来看一下几种停止SpringBoot的方法。第一种就是 SpringBoot 提供的actuator的功...原创 2020-05-14 14:15:07 · 3812 阅读 · 12 评论 -
Java获取及处理富文本图片地址
最近遇上了富文本图片与资源服务器不匹配的问题,百度了一些文章,总结的几个方法。1、使用正则表达是获取图片地址后,重新组合富文本的内容public static List<String> getImgStr(String htmlStr) { List<String> list = new ArrayList<>(); S...原创 2020-05-06 11:54:24 · 2406 阅读 · 0 评论 -
java 区块链
本文目的是通过java实战开发教程理解区块链是什么。将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等。这个基本的java区块链也实现简单的工作量证明系统。本文用一个java例子,演示了开发一个区块链应用的过程,涉及到所有区块链的概念和基本实现方法。本文阅读对象,主要是希望和即将从事区块链开发的项目架构师。需要指出的是,我们用150行java代码构建的区...转载 2020-03-10 17:02:13 · 438 阅读 · 0 评论 -
JAVA8十大新特性 -- 函数式接口详解
介绍函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式(箭头函数)。函数式接口代表的一种契约, 一种对某个特定函数类型的契约。Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型(interface),而这个目标类型就是某个函数式接口。java8之前已...原创 2020-01-09 14:13:37 · 261 阅读 · 0 评论 -
JAVA8十大新特性
一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); }}...原创 2020-01-09 10:53:39 · 166 阅读 · 0 评论 -
Java 8 Lambda 表达式(二)
例1、用lambda表达式实现Runnable我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。我们在这里做了什么呢?那就是用() -> {}代码块替代了整个匿名类。// Java 8之前:new Thread...原创 2019-12-09 16:44:08 · 388 阅读 · 0 评论 -
Java 8 Lambda 表达式(一)
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。语法lambda 表达式的语法格式如下:(parameters) -> expression 或 (parameters) ->{ statements; }...原创 2019-12-09 15:55:56 · 2895 阅读 · 0 评论 -
PO,VO,DAO,BO,POJO 之间的区别你懂吗?
VOvalue object:值对象。通常用于业务层之间的数据传递,由new创建,由GC回收。POpersistant object:持久层对象。对应数据库中表的字段。VO 和 PO 都是属性加上属性的 get 和 set 方法;表面看没什么不同,但代表的含义是完全不同的。DTOdata transfer object:数据传输对象。表里面有十几个字段:id,nam...转载 2019-10-16 16:42:15 · 156 阅读 · 0 评论 -
springboot知识点整理
那 Spring Boot 有何魔法?自动配置、起步依赖、Actuator、命令行界面(CLI) 是 Spring Boot 最重要的 4 大核心特性,其中 CLI 是 Spring Boot 的可选特性,虽然它功能强大,但也引入了一套不太常规的开发模型,因而这个系列的文章仅关注其它 3 种特性。如文章标题,本文是这个系列的第一部分,将为你打开 Spring Boot 的大门,重点为你剖析其启...转载 2019-02-20 10:51:08 · 4260 阅读 · 0 评论 -
【知识点】Java类初始化顺序总结
一、类的结构:静态属性:static 开头定义的属性 静态方法块: static {} 圈起来的方法块 普通属性: 未带static定义的属性 普通方法块: {} 圈起来的方法块 构造函数: 类名相同的方法 方法: 普通方法public class Test { // 静态属性 private static String staticField = getStat...原创 2019-02-21 11:43:33 · 338 阅读 · 0 评论 -
编程式实现spring的aop机制
(1)创建一个接口和实现类(2)编写前置增强和后置增强(这里我将两个增强合并,即实现两个接口)(3)JUnit来测试(3)环绕增强(当把两个接口合并时,其实完全可以用一个接口就行) 环绕增强类需要实现 org.aopalliance.intercept.MethodInterceptor接口。注意,这个接口不是 Sprin...原创 2019-03-11 00:46:23 · 449 阅读 · 0 评论 -
多线程共享数据的方式:
转:http://blog.csdn.net/hejingyuan6/article/details/47053409#1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对...转载 2019-03-18 19:30:23 · 425 阅读 · 0 评论 -
Redis学习笔记
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(M...原创 2019-01-09 17:16:55 · 203 阅读 · 0 评论 -
Java并发编程问题合集
1、在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。两者的区别: 唯一...原创 2019-01-18 11:59:09 · 219 阅读 · 0 评论