自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 怎么break java8 stream的foreach

简介我们通常需要在java stream中遍历处理里面的数据,其中foreach是最最常用的方法。但是有时候我们并不想处理完所有的数据,或者有时候Stream可能非常的长,或者根本就是无限的。一种方法是先filter出我们需要处理的数据,然后再foreach遍历。那么我们如何直接break这个stream呢?今天本文重点讲解一下这个问题。使用Spliterator上篇文章我们在讲Spliterator的时候提到了,在tryAdvance方法中,如果返回false,则Spliterator将会停止

2022-04-30 18:15:21 1666

原创 java 8 stream中的Spliterator简介

简介Spliterator是在java 8引入的一个接口,它通常和stream一起使用,用来遍历和分割序列。只要用到stream的地方都需要Spliterator,比如List,Collection,IO channel等等。我们先看一下Collection中stream方法的定义:default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); }default

2022-04-30 18:13:53 1413 1

原创 怎么在java中创建一个自定义的collector

简介在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类。今天我们介绍一下怎么自定义一个Collector。Collector介绍我们先看一下Collector的定义:Collector接口需要实现supplier(),accumulator(),combiner(),finisher(),characteristics()这5个接口。同时Collector也

2022-04-30 18:12:41 790

转载 java 8 stream reduce详解和误区

简介Stream API提供了一些预定义的reduce操作,比如count(), max(), min(), sum()等。如果我们需要自己写reduce的逻辑,则可以使用reduce方法。本文将会详细分析一下reduce方法的使用,并给出具体的例子。reduce详解Stream类中有三种reduce,分别接受1个参数,2个参数,和3个参数,首先来看一个参数的情况:Optional<T> reduce(BinaryOperator<T> accumulator);该方法

2022-04-30 18:11:27 538

原创 java stream中Collectors的用法

简介在java stream中,我们通常需要将处理后的stream转换成集合类,这个时候就需要用到stream.collect方法。collect方法需要传入一个Collector类型,要实现Collector还是很麻烦的,需要实现好几个接口。于是java提供了更简单的Collectors工具类来方便我们构建Collector。下面我们将会具体讲解Collectors的用法。假如我们有这样两个list:List<String> list = Arrays.asList("jack",

2022-04-30 18:08:46 5250

原创 java关于throw Exception的一个小秘密

简介之前的文章我们讲到,在stream中处理异常,需要将checked exception转换为unchecked exception来处理。我们是这样做的:static <T> Consumer<T> consumerWrapper( ThrowingConsumer<T, Exception> throwingConsumer) { return i -> { try { throwingC

2022-04-30 18:05:05 2740 1

原创 java 8 lambda表达式中的异常处理

简介java 8中引入了lambda表达式,lambda表达式可以让我们的代码更加简介,业务逻辑更加清晰,但是在lambda表达式中使用的Functional Interface并没有很好的处理异常,因为JDK提供的这些Functional Interface通常都是没有抛出异常的,这意味着需要我们自己手动来处理异常。因为异常分为Unchecked Exception和checked Exception,我们分别来讨论。处理Unchecked ExceptionUnchecked exception

2022-04-30 18:03:24 4347

原创 java中Runnable和Callable的区别

java中Runnable和Callable的区别在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是java1.5添加进来的一个增强版本。本文我们会详细探讨Runnable和Callable的区别。运行机制首先看下Runnable和Callable的接口定义:@FunctionalInterfacepublic interface Runnable { /** * When an object implementing interface &

2022-04-29 16:52:24 1115

转载 java并发中ExecutorService的使用

java并发中ExecutorService的使用ExecutorService是java中的一个异步执行的框架,通过使用ExecutorService可以方便的创建多线程执行环境。本文将会详细的讲解ExecutorService的具体使用。创建ExecutorService通常来说有两种方法来创建ExecutorService。第一种方式是使用Executors中的工厂类方法,例如:ExecutorService executor = Executors.newFixedThreadPool(

2022-04-29 16:51:30 2108

原创 java中Future的使用

java中Future的使用Future是java 1.5引入的一个interface,可以方便的用于异步结果的获取。 本文将会通过具体的例子讲解如何使用Future。创建Future正如上面所说,Future代表的是异步执行的结果,意思是当异步执行结束之后,返回的结果将会保存在Future中。那么我们什么时候会用到Future呢? 一般来说,当我们执行一个长时间运行的任务时,使用Future就可以让我们暂时去处理其他的任务,等长任务执行完毕再返回其结果。经常会使用到Future的场景有:1. 计

2022-04-29 16:50:36 6015

原创 java中wait和sleep的区别

java中wait和sleep的区别在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别。并讨论一下怎么使用这两个方法。Wait和sleep的区别wait() 是Object中定义的native方法:public final native void wait(long timeout) throws InterruptedException;所以每一个类的实例都可以调用这个方法。wait()只能在synchronized block中调用。它会释放synchroniz

2022-04-29 16:49:37 234

原创 java中的Volatile关键字使用

java中的Volatile关键字使用在本文中,我们会介绍java中的一个关键字volatile。 volatile的中文意思是易挥发的,不稳定的。那么在java中使用是什么意思呢?我们知道,在java中,每个线程都会有个自己的内存空间,我们称之为working memory。这个空间会缓存一些变量的信息,从而提升程序的性能。当执行完某个操作之后,thread会将更新后的变量更新到主缓存中,以供其他线程读写。因为变量存在working memory和main memory两个地方,那么就有可能出现不一

2022-04-29 16:48:41 1105

转载 java并发中的Synchronized关键词

java并发中的Synchronized关键词如果在多线程的环境中,我们经常会遇到资源竞争的情况,比如多个线程要去同时修改同一个共享变量,这时候,就需要对资源的访问方法进行一定的处理,保证同一时间只有一个线程访问。java提供了synchronized关键字,方便我们实现上述操作。为什么要同步我们举个例子,我们创建一个类,提供了一个setSum的方法:public class SynchronizedMethods { private int sum = 0; public

2022-04-29 16:47:19 144

原创 java.util.concurrent简介

java.util.concurrent简介java.util.concurrent包提供了很多有用的类,方便我们进行并发程序的开发。本文将会做一个总体的简单介绍。主要的组件java.util.concurrent包含了很多内容, 本文将会挑选其中常用的一些类来进行大概的说明:ExecutorExecutorServiceScheduledExecutorServiceFutureCountDownLatchCyclicBarrierSemaphoreThreadFactoryE

2022-04-29 16:46:01 249

原创 jboss~静态文件路由和自定义日志

由于我的jboss项目去在容器中运行的,所以我习惯上把这些扩展功能添加到cli文件 ,然后在Dockerfile里把它们进行添加,动态为主程序添加功能。DockerfileFROM jboss/keycloak:14.0.0USER root# 日志ADD log4.cli /opt/jboss/startup-scripts/# 静态文件路由ADD static_resource.cli /opt/jboss/startup-scripts/log4.cliembed-server

2022-04-27 11:08:45 2252

原创 java~RMI引起的log4j漏洞

2021-12-10日左右,java的log4j框架出现了一个大漏洞,对服务器案例引起了不小的影响,当然只对于log4j的日志使用者来说,如果你是spring框架,用的是logback,不存在这个问题。RMI和JNDIRMI(Remote Method Invocation) 即Java远程方法调用,一种用于实现远程过程调用的应用程序编程接口JNDI (Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用

2022-04-27 11:06:00 388

原创 keycloak~11.3.0之后微信认证问题解决

基于keycloak11.0.3版的微信认证的实现,而在升级到keycloak14.0.0之后,这个认证出现了问题,原因是因为人家keycloak内部源码又变了。影响类文件 server-spi-private/src/main/java/org/keycloak/broker/provider/BrokeredIdentityContext.javagithub地址:https://github.com/keycloak/keycloak/commit/41dc94fead4c20560e0dd96

2022-04-27 11:01:28 1225 1

原创 maven编译后复制到目标位置

maven对项目进行打包之后,可以将打包好的jar和某些资源文件复制到指定位置,例如你的项目结构是services父项目下有个子项目,service-1,它在打包之后,希望把jar和templates文件夹复制到父项目services的target目录,这就可以使用maven的两个插件来完成。maven-dependency-plugin编译之后,将当前项目的jar复制到某个目录下 <plugin> <artifactId>maven-dependency-plugin

2022-04-27 11:00:03 4074

原创 keycloak~KEYCLOAK_REMEMBER_ME中文用户名问题新版已经解决

keycloak11.0.3由于undertow不支持中文的cookie,所以如果使用记住密码功能时,存储的KEYCLOAK_REMEMBER_ME会出现错误,导致应用程序崩溃。原码问题截图keycloak新版本(从14.0开始)这个问题已经通过urlEncode编码进行了解决,当然对于kc管理平台的中文查询,也同样有这个编码的问题愿与诸君共进步,大量的面试题及答案还有资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务

2022-04-27 10:57:34 233

原创 keycloak~避免出现“用户已登录“的界面

场景keycloak出现"用户已登录"的界面的场景我们需要先搞清楚,主要是这样的操作:用户打开一个浏览器,在上面同时打开多个登录窗口用户先在一个窗口上进行登录用户再第二个窗口上再进行登录这时,出现用户已经登录,事实上,在kc上,如果你已经登录了,则不能再使用其它用户登录了原因同一个浏览器在同一个kc realm下,它的sessionid是相同的,所以被认为一个用户,不支持多个用户的sessionid多用户登录改进如果希望kc支持在一个用户登录后,再刷新第二个界面的登录页,再使用第二个用

2022-04-27 10:54:32 471

原创 java~Comparable接口的说明

Comparable接口给对象提供了比较的能力,即对象实现了Comparable,它就可以向自然数一种,进行比较和排序了,而在这个接口里有个方法compareTo,那么这个方法里,返回-1,0,1时,如何理解它对接的排序关系呢,下面看个例子:@Overridepublic int compareTo(Student o) { if (this.score > o.score) return -1; else if (this.score < o.score)

2022-04-27 10:53:20 305

原创 springboot~某个接口模拟登录并同步给feign

功能某个rest接口是公开的,它的feign服务的接口需要授权重写一个HttpServletRequestWrapper,实现模拟登录之后把header头进行填充接口请求上下文里的token,通过Feign拦截器转给每个feign请求上下文完成对feign接口的自动授权访问 重写HttpServletRequestWrapper/** * 自定义的请求上下文. */public class CustomHttpServletRequest extends HttpServletReque

2022-04-26 12:23:34 350

原创 springcloud~feign POST form-url-encoded data

起因对于微服务之后发请求,目前使用feign是比较多的,对外部服务也是同样支持的,有时间我们会有这样的情况,post请求时,不是使用的json raw的方式,而是使用了application/x-www-form-urlencoded这种方式,对于feign来说,这种方法的post默认是不被支持的,我们需要对feign进行一个扩展。一般,一个POST的请求是这样的,它采用application/x-www-form-urlencoded的方式进行提交curl -X POST \ https://a

2022-04-26 12:21:32 788

原创 java~和.net相通的DES-ECB加解密技术

起因首先,对于一个公司,即有.net又有java开发来说,加解密是需要相互打通的,因为,根据莫非定律你迟早会有“.net加密让java解密“的情况。.net实现public static string Encrypt(SymmetricAlgorithm algorithm, string plaintext, string key) { TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvi

2022-04-26 12:20:14 578

原创 java的byte和C#的byte的不同之处

Java byte也提供了一个byte数据类型,并且是基本类型。java byte是做为最小的数字来处理的,因此它的值域被定义为-128~127,byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。C# bytec#的byte边界值为:0~255,java的byte边界值为:-128~127。 当byte >=0 &

2022-04-26 12:19:01 2398

原创 spi~动态监控目录的jar实现热加载

对于我们自己封装的spi来说,我们可能希望他实现类似于插件的功能,例如你有一个汽车工厂,你目前有提供小汽车,如果你希望他动态支持卡车,公交车,那么spi可以帮你实现这个功能,对于我实现这个SPI功能主要由以下几个步骤组成。对文件夹目录的监控对文件夹里jar也的装载,动态类加载器机制实现通过类型名称,返回实现类的列表具体实现目录监控/** * 目录监控. * * @param path */ public static void watchDir

2022-04-26 12:18:05 555

原创 jboss( WildFly)上运行 springboot程序

WildFly,原名 JBoss AS(JBoss Application Server) 或者 JBoss,是一套应用程序服务器,属于开源的企业级 Java 中间件软件,用于实现基于 SOA 架构的 Web 应用和服务。 WildFly 包含一组可独立运行的软件。WildFly采用积极的方法进行内存管理。开发基本运行时服务是为了最大程度地减少堆分配。这些服务在重复的完整解析中使用公共的缓存索引元数据,从而减少了堆和对象的流失。模块化类加载的使用可防止重复类和加载超出系统配置要求的类。这不仅减少了基本内存

2022-04-26 12:16:31 707

原创 es~seq_no_primary_term问题的解决

seq_no_primary_term这个错误在聚合操作时出现的问题,这个问题是由于es客户端的版本与服务端版本不兼容的问题,例如:你的客户端是6.8.7,而es服务器版本是6.5.4,这时再进行topHits聚合操作时,就会出现这个错误。es服务器版本es客户端版本 <dependency> <groupId>org.elasticsearch</groupId> <artifactId&gt

2022-04-26 12:14:59 1048

原创 springboot~ConfigurationProperties注解配置集合对象

ConfigurationProperties主要用来对格式化配置信息进行整理,将多个相关的配置信息整理到一个类里,这个类可以被@ConfigurationProperties修饰,如果希望它启用,需要添加@Configuration这些注解,如果没有添加@Configuration注解,那么在启动类上添加@EnableConfigurationProperties注解也是一样的,都是将你的@ConfigurationProperties配置加载到IOC容器里。类型对象的注册下面有我的配置信息,一个复杂

2022-04-25 18:29:38 2366

原创 算法~位运算ObjectId生成时的秒用

位运算控制数字范围通过位运算,可以对一个数进行限制,保证这个数在2n-1(3,7,15,31,63,127,255…)范围内,当大于指定的数时,会取这个0到2n-1里的某个数,不会让它溢出。本文在ObjectId里的应用ObjectId最早在mongodb的分布式环境出现,用来生成主键,因为mongodb是一个集群的,分布式的,所以要求它的主键的要求更高;它主要使用一个12个字节进行存储,而我们知道每1个字节对应8位二进制数,而每4二进制数对应1个16进制数,所以12个字节用16进制表示,就是24个1

2022-04-25 18:28:41 138

原创 es~ElasticsearchTemplate的查询和聚合

查询条件主要包含了以下几个match_allmatchtermrangematchmatch类型查询,会把查询条件进行分词,然后再查询,词条之间是or关系,按照相关性得分排序。GET /lind/_search{ "query": { "match":{ "name": "hello world" } }}改成and,并且的关系GET /lind/_search{ "query":{ "match":{

2022-04-25 18:26:40 1759

原创 在底层框架使用@SneakyThrows注解

@SneakyThrows注解是由lombok为我们封装的,它可以为我们的代码生成一个try…catch块,并把异常向上抛出来,而你之前的ex.getStackTrace()是没有这种能力的,有时,我们从底层抛出的异常需要被上层统一收集,而又不想在底层new出一大堆业务相关的异常实例,这时使用@SneakyThrows可以简化我们的代码。@SneakyThrows为方法添加注解import lombok.SneakyThrows;public class SneakyThrowsExample im

2022-04-25 18:24:29 1604 1

原创 java~ReentrantLock的介绍

ReentrantLockjava除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。ReentrantLock与synchronized来的区别synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock也是独占锁,加锁和解锁的过

2022-04-25 18:23:08 2007 1

原创 springboot~aspect通过@annotation进行拦截

annotation就是注解的意思,在我们使用的拦截器时,可以通过业务层添加的某个注解,对业务方法进行拦截,之前我们在进行统一方法拦截时使用的是execution,而注解的拦截我们使用@annotation即可,我们可以做个例子,比如搞个防止重复提交的注解,然后在拦截器里去写防止重复提交的逻辑就好了。拦截器数据源/** * 防止重复提交 * * @author BD-PC220 */@Documented@Retention(RetentionPolicy.RUNTIME)@Target(

2022-04-25 18:21:23 2742

原创 springboot~@ConditionalOnMissingBean注解的作用

@ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个,当你注册多个相同的bean时,会出现异常,以此来告诉开发人员。代码演示@Componentpublic class AutoConfig { @Bean public AConfig aConfig() { return new AConfig("lind")

2022-04-25 18:20:03 1430

原创 java~线程池的总结

线程的创建和效率都需要消耗处理器(cpu)的资源,所以我们在使用线程时需要注意,你的每一个动作都是需要为它买单的,也正是因为线程的使用需要谨慎,所以java对线程的管理也进行了封装,就是今天要说的线程池,目前java主要封装了大概4大种类型的线程池,下面简单来介绍一下。四大类型的线程池newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线

2022-04-24 17:35:51 88

原创 k8s~为服务添加sidecar边斗

sidecar这个词一般指带有跨斗的摩托车,在二战时候小日本开着很多这种摩托车,它在原有基础上添加了一个跨斗,之后就可以多载一个人,而对于原来的两轮摩托车没有什么影响,把跨斗拆了也是可以的,对原来的事物没有本质上的破坏,只是扩展了新的功能,这与软件开发里的OCP原则很像,在服务网格的istio里也有这个概念,它把这种组件叫“sidecar”,在istio里sidecar也只是一个概念,具体是由envoy来实现的。具体fluentd功能的sidecar我们的容器部署到k8s里,通过k8s来管理我们的容器,

2022-04-24 17:34:06 2977

原创 Springboot~多个数据源时自定义datasource的bean

当我们的项目里有多种数据源时,mysql,h2,mongodb,es等等,这时你需要为每种数据源添加自己的bean类,在bean里构建配置,而直接在yml里的配置往往会出现循环引用的问题。org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'scopedTarget.dataSource': Requested bean is currently in creat

2022-04-24 17:30:36 1899

原创 springboot~aspose操作word模板实现导出功能

事情是这样的,系统有这样一个需求,有一些单子供客户下载打印,做为凭证,而这些单子一般属于word格式的,里面的排版非常固定,只是上面的内容不同,这就属于word模板的范畴了,目前比较不好的操作word的组件就是aspose了,下面我来说一下它的使用方法。word模板主要使用了word里的域,然后选择“邮件合并”,在“域名”处输入你的word变量名,然后在java代码里为这个变量赋值就可以了添加组件引用把组件放到resource/lib目录下 <dependency>

2022-04-24 17:28:55 902

原创 spring-security-jwt的总结与实现

jwt的总结与实现请求和响应请求实体-规定的客户端传给jwt认证服务器的参数响应实体-规定了jwt服务端颁发给客户端的jwt token的结果jwtUtil类主要提供了jwt的实现方法,如加密规则,生成token,获取token等SecurityConfigurer类主要设置了加密方法,用户信息读取方法,配置路由的授权规则等过滤器JwtRequestFilter对指定的http请求进行拦截和用户认证等测试类可以使用postman类似的工具进行jwt的测试post http://

2022-04-24 17:27:08 1599 1

空空如也

空空如也

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

TA关注的人

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