自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一文弄懂EnumMap和EnumSet

简介一般来说我们会选择使用HashMap来存储key-value格式的数据,考虑这样的特殊情况,一个HashMap的key都来自于一个Enum类,这样的情况则可以考虑使用本文要讲的EnumMap。EnumMap先看一下EnumMap的定义和HashMap定义的比较:public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializa

2022-04-30 18:28:01 492

原创 深入理解HashMap和LinkedHashMap的区别

简介我们知道HashMap的变量顺序是不可预测的,这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的。这个特性通常会对我们的工作造成一定的困扰。为了实现这个功能,我们可以使用LinkedHashMap。LinkedHashMap详解先看下LinkedHashMap的定义:public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>LinkedHas

2022-04-30 18:27:21 2000

原创 深入理解HashMap和TreeMap的区别

简介HashMap和TreeMap是Map家族中非常常用的两个类,两个类在使用上和本质上有什么区别呢?本文将从这两个方面进行深入的探讨,希望能揭露其本质。HashMap和TreeMap本质区别先看HashMap的定义:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable再看TreeMap的定义:public cla

2022-04-30 18:26:12 2284 1

原创 Copy ArrayList的四种方式

简介ArrayList是我们经常会用到的集合类,有时候我们需要拷贝一个ArrayList,今天向大家介绍拷贝ArrayList常用的四种方式。使用构造函数ArrayList有个构造函数,可以传入一个集合: public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) {

2022-04-30 18:25:15 2692

原创 asList和ArrayList不得不说的故事

简介提到集合类,ArrayList应该是用到的非常多的类了。这里的ArrayList是java.util.ArrayList,通常我们怎么创建ArrayList呢?创建ArrayList看下下面的例子:List<String> names = new ArrayList<>();上面的方法创建了一个ArrayList,如果我们需要向其中添加元素的话,需要再调用add方法。通常我们会使用一种更加简洁的办法来创建List: @Test public void

2022-04-30 18:23:44 1044

原创 Iterator to list的三种方法

简介集合的变量少不了使用Iterator,从集合Iterator非常简单,直接调用Iterator方法就可以了。那么如何从Iterator反过来生成List呢?今天教大家三个方法。使用while最简单最基本的逻辑就是使用while来遍历这个Iterator,在遍历的过程中将Iterator中的元素添加到新建的List中去。如下面的代码所示: @Test public void useWhile(){ List<String> stringList= ne

2022-04-30 18:22:16 1865

原创 fail-safe fail-fast知多少

简介我们在使用集合类的时候,通常会需要去遍历集合中的元素,并在遍历中对其中的元素进行处理。这时候我们就要用到Iterator,经常写程序的朋友应该都知道,在Iterator遍历的过程中,是不能够修改集合数据的,否则就会抛出ConcurrentModificationException。因为ConcurrentModificationException的存在,就把Iterator分成了两类,Fail-fast和Fail-safe。Fail-fast IteratorFail-fast看名字就知道它的意

2022-04-30 18:19:58 283

原创 在java中使用JMH(Java Microbenchmark Harness)做性能测试

在java中使用JMH(Java Microbenchmark Harness)做性能测试JMH的全称是Java Microbenchmark Harness,是一个open JDK中用来做性能测试的套件。该套件已经被包含在了JDK 12中。本文将会讲解如何使用JMH来在java中做性能测试。如果你使用的不是JDK 12,那么需要添加如下依赖:<dependency> <groupId>org.openjdk.jmh</groupId> <a

2022-04-29 17:25:22 426

原创 java中CyclicBarrier的使用

java中CyclicBarrier的使用CyclicBarrier是java 5中引入的线程安全的组件。它有一个barrier的概念,主要用来等待所有的线程都执行完毕,然后再去执行特定的操作。假如我们有很多个线程,每个线程都计算出了一些数据,然后我们需要等待所有的线程都执行完毕,再把各个线程计算出来的数据加起来,的到最终的结果,那么我们就可以使用CyclicBarrier。CyclicBarrier的方法我们先看下CyclicBarrier的构造函数: public CyclicBarri

2022-04-29 17:24:27 758

原创 java中CyclicBarrier的使用

java中CyclicBarrier的使用CyclicBarrier是java 5中引入的线程安全的组件。它有一个barrier的概念,主要用来等待所有的线程都执行完毕,然后再去执行特定的操作。假如我们有很多个线程,每个线程都计算出了一些数据,然后我们需要等待所有的线程都执行完毕,再把各个线程计算出来的数据加起来,的到最终的结果,那么我们就可以使用CyclicBarrier。CyclicBarrier的方法我们先看下CyclicBarrier的构造函数: public CyclicBarri

2022-04-29 17:23:17 220

原创 java并发中CountDownLatch的使用

java并发中CountDownLatch的使用在java并发中,控制共享变量的访问非常重要,有时候我们也想控制并发线程的执行顺序,比如:等待所有线程都执行完毕之后再执行另外的线程,或者等所有线程都准备好了才开始所有线程的执行等。这个时候我们就可以使用到CountDownLatch。简单点讲,CountDownLatch存有一个放在QueuedSynchronizer中的计数器。当调用countdown() 方法时,该计数器将会减一。然后再调用await()来等待计数器归零。private sta

2022-04-29 17:22:21 2191

原创 java 中的fork join框架

java 中的fork join框架fork join框架是java 7中引入框架,这个框架的引入主要是为了提升并行计算的能力。fork join主要有两个步骤,第一就是fork,将一个大任务分成很多个小任务,第二就是join,将第一个任务的结果join起来,生成最后的结果。如果第一步中并没有任何返回值,join将会等到所有的小任务都结束。还记得之前的文章我们讲到了thread pool的基本结构吗?ExecutorService - ForkJoinPool 用来调用任务执行。workerTh

2022-04-29 17:19:38 757

转载 java中ThreadPool的介绍和使用

java中ThreadPool的介绍和使用Thread Pool简介在Java中,threads是和系统的threads相对应的,用来处理一系列的系统资源。不管在windows和linux下面,能开启的线程个数都是有限的,如果你在java程序中无限制的创建thread,那么将会遇到无线程可创建的情况。CPU的核数是有限的,如果同时有多个线程正在运行中,那么CPU将会根据线程的优先级进行轮循,给每个线程分配特定的CPU时间。所以线程也不是越多越好。在java中,代表管理ThreadPool的接口有两个

2022-04-29 17:17:38 683

原创 springBoot~跨域后PUT,DELETE方法出现403Forbidden

ajax中的put和deleteSpringBoot默认跨域方法只支持HEAD,GET,POST,部分源代码//package org.springframework.web.cors.CorsConfiguration/** Wildcard representing <em>all</em> origins, methods, or headers. */ public static final String ALL = "*"; private stat

2022-04-27 11:28:43 1733 1

原创 springboot~将一个Integer类型序列为k/v对象

对于一些带着固定标签的字段来说,我们通常把它们配置到字段中,而在数据库中存它们的字典code,或者是字典主键,不是一个整型的数字,而在前端显示时,有时需要将它们翻译成名称,这时后端可以帮他们进行翻译,或者前端通过code自己使用字典翻译;下面说一下第一种,后端在View model中将integer类型的字典字典翻译成一个k/v的对象。JsonSerializer一个json序列化的基类,我们可以继承它,并实现自己的原因,在springboot框架中,你返回的json对象事实上是jackson帮我们做了

2022-04-27 11:27:41 206

原创 springboot~jackson和redis日期序列化

日期类型,我们需要统一它在被序列化后的格式,序列化是指把java类型通过网络系统或者IO进行持久化,如把一个java对象保存到txt文件里,或者把java对象保存到redis里,又或者把java对象通过网络以JSON的格式输出到浏览器上。jackson的日期序列化public class JacksonDateSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyW

2022-04-27 11:26:25 683

原创 java~PECS原则

pecs全称是Producer Extends Consumer Super使用extends确定上界的只能是生产者,只能往外生产东西,取出的就是上界类型。不能往里塞东西。使用Super确定下界的只能做消费者,只能往里塞东西。取出的因为无法确定类型只能转成Object类型看代码更好理解。代码List<? extends Number> numbers = new ArrayList();numbers.add(4); //报错Number number = numbers.ge

2022-04-27 11:25:02 911 1

原创 springboot~mybatis-plus枚举到数据库整型字段

数据库字段为int类型实体字段为了可读性强,使用枚举类型默认情况一般来说,数据库为varchar时,你的枚举元素直接会进行转换字段为整型这些如果你是mybatis-plus,可以使用如下default-enum-type-handler参数开启@EnumValue特性,将每句的@EnumValue注释的字段添加到数据表字段中。测试枚举public enum ModuleType implements NameValueEnum { LOGIN(0, "登录"), LO.

2022-04-27 11:23:54 864

原创 java~并行计算~Future和Callable实现大任务的并行处理

Callable是一个泛型接口,也是一个FunctionalInterface,即函数式接口,它可以使用在Lambda表达式上,即现在比较流行的函数式编程,其实java8之后,封装了好多函数式接口,今天说的Callable它是一个带有返回值的接口,它主要和Future一起使用,用在并行计算上;并行计算就是说,一个大任务,多个线程并发执行,这样可以缩减程序运行的时间,当然前提是你要保持线程的安全性。大任务实现类/** * 干一件不好干的事,使用Callable接口,需要 FutureTask实现

2022-04-26 12:46:15 1205

原创 springboot~对@RequestParam中Date参数的适配

@RequestParam中的Date类型的参数,如果前端给一个2001-01-01在后端默认是不认的,我们在后端需要对这种情况进行适配,我们可以通过@ControllerAdvice注解来拦截请求,然后对Date参数进行转换,最终实现我们的需求。实现org.springframework.core.convert.converter.Convert接口,来完成日期格式的转换 public class CourseDateConverter implements Converter<Str

2022-04-26 12:45:26 1953

原创 keycloak~nginx实现的https转发

keycloak我们都以docker为例子,来讲一下https的部署。https更安全,加密传输kc有些cookies,需要https的支持nginx部署upstream keycloak { server 192.168.*.*:8080;}server { server_name kc.lind.com; listen 443 ssl; ssl_certificate /usr/local/nginx/tls.crt; ssl_cert

2022-04-26 12:44:03 1340

原创 keycloak~为认证提供者添加配置项

keycloak提供多种认证提供者,如用户名密码的方式,第三方社区的方式,一般来说,第三方社区的方式都是符合oauth2标准的,第三方社区像github,google,weixin之类的都需要你去申请个appid,appsecret,而这些信息我们不要硬编码,kc为我们提供了一种配置的方式,在kc管理平台中去配置它们。几种认证接口Authenticator 认证接口 AbstractFormAuthenticator 表单认证 AbstractUsernameFormAuthentica

2022-04-26 12:43:18 672

原创 springboot~使用freemaker模版进行部署

实事上keycloak框架使用了freemaker进行页面部署,在页面上使用了vue进行了渲染,还是比较跟的上技术前沿的,只不过,keycloak没有使用spring框架,可能是因为它是redhat公司推出的产品吧。依赖引用<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>

2022-04-26 12:41:50 239

原创 keycloak~docker部署https的keycloak使用自定义证书

使用自定义证书需要先生成一对证书,其中.crt文件是公钥,也叫证书,在浏览器上可以看到;.key文件是私钥,由网站服务器自己保留。keycloak sslkeycloak的ssl默认有自己的自签名证书,这个如果涉及到你的程序调用kc的接口,kc使用自定义证书是不行的,你调不通,使用使用正规的证书ssl的https端口是8443,在使用docker启动时,监听它即可ssl的自定义证书目录是/etc/x509/https,使用docker时,把自定义证书挂载到这个目录即可为什么要使用https

2022-04-26 12:40:33 1722

原创 java~jsonp的使用

对于一个后端程序来发,它可能会被多个应用调用,而跨域的问题就来了,使用jsonp来解决这个问题是个不错的方式,下面说一下关于jsonp的知识JSONP不是新技术,只是在页面上响应一段js对于响应的 MIME type (‘text/plain’)需要注解,它由于受到了X-Content-Type-Options:nosniff的限制,在跨域时你的js是不支持的基于上面的原因,我们的服务器的接口方法,返回MIME应该是application/javascript服务端代码 @GetMappi

2022-04-26 12:39:09 1178

原创 maven-shade-plugin~打包时过滤项目中某些包

maven-shade-plugin可以用来进行打包,并实现在打包过程中的一些过滤、排除、包含、重命名等一系列操作,当我们设计公用项目时,有时在项目时会有一些测试用例,如果在打包时想把这些测试包排除,使用maven-shade-plugin插件是个不错的选择。打包包含和排除下面的代码实现了以下几个功能:打包时排除com.lind.uaa.jwt.three包下的所有内容打包时排除项目的properties类型的配置文件打包时,com.baomidou组织的包添加到当然JAR包里,默认是不会添加到当

2022-04-25 18:51:55 3601

原创 springboot~uaa~scope对实体的字段添加限制

scope授权思路通过实现JsonSerializer抽象类的serialize方法来进行指定类型的序列化,在序列化中对持有ScopeSet注解的字段进行解析,当没有对象的scope时,对字段不进行渲染,从而保护了字段资源。之前的尝试MappingJackson2HttpMessageConverter之前使用MappingJackson2HttpMessageConverter的定义,将@ScopeSet进行检查,并对字段按着scope值进行输出,最后的结果是失败的,因为MappingJacks

2022-04-25 18:46:57 528

原创 java~通过ClassLoader动态加载~tomcat模型

在进行非WEB项目(Springboot)进行开发时,使用classLoader进行动态加载jar,并使用接口进行强类型转换是没有问题的,它们使用JVM下的URLClassLoader进行实现,而在基于tomcat的容器里使用它时,出现了类型无法找到的问题,原因如下:tomcat有个叫webApp的加载器它是先加载WEB-INF/classes后在加载WEB-INF/lib,但它的父加载器是它的common加载器,comon的父加载器是system加载器(和JVM的应用程序加载器功能差不多,不过指定了其

2022-04-25 18:45:34 2375

原创 java~通过springloaded实现热部署

之前写过使用自定义的classLoader进行动态加载,热部署;它有很多弊端,我总结一下:当前项目不能引用第三方包当前项目必须使用反射的方式调用第三方包的方法写死的一些路径springloaded源码:https://github.com/spring-projects/spring-loaded功能:实现java项目的依赖包的热更新研究了一天,终于研究出了成功了,国内也有不少这方面的文章,但也有一些坑,所以我总结一下:源项目 a-start-hot-deploy依赖项目 a-sta

2022-04-25 18:44:14 548 1

原创 java~通过ClassLoader动态加载类,实现简单的热部署

热部署一般是在开发中使用,在spring里一般使用devtools,springloaded等工具来实现,一般在调试项目时不需要再发布,而直接加载变化的类对象即可;而有时有生产环境也需要考虑对一些jar进行热部署。说明:本方法是加载外部包里的类,然后通过反射实现,如果你引用了这个包到项目里,那本方法将失效一个类加载器只能加载一个同名类,在Java默认的类加载器层面作了判断,如果已经有了该类,则不再重复加载,如果强行绕过判断并使用自定义类加载器重复加载,JVM 将会抛出 LinkageError:a

2022-04-25 18:42:17 664

原创 springboot~重写json序列化方式

在springboot里,推荐我们通过WebMvcConfigurer的派生类重写你的请求,你可以利用WebMvcConfigurer对http请求添加一些拦截器,addCorsMappings,addResourceHandlers,消息返回格式等等,需要注意的是,你需要使用@EnableWebMvc注解override springboot默认的方法;WebMvcConfigurer虽然是接口,但它的方法都是有default默认实现的。public interface WebMvcConfigurer

2022-04-24 17:57:25 1370

原创 shade解决mybatis包冲突

目前有一个项目,A是第三方应用,代码不公开,不能修改,使用的是mybatis plugs3.3.1,而当前项目是我们自己的B,它需要用到A里的方法,B里mybatis plugs版本是2.3,目前在使用过程中出现了问题,这两个版本的有些方法,注解都发生了很大的变化 :mybatis 3.x BaseMapper注解的位置:import com.baomidou.mybatisplus.core.mapper.BaseMapper;mybatis 2.x BaseMapper注解的位置:import c

2022-04-24 17:55:22 800

原创 springboot~注册不同级别包里的bean~ImportSelector

这次主要说一下ImportSelector来实现加载不同包的方法,事实上,在springboot里,所有的Enable开头的组件也是使用的这种方式来实现的。nacos组件里的体现异步组件里的体现@SpringBootApplication注解里也实现了@ComponentScan,所以scanBasePackages其实就是@ComponentScan里的basePackages参数ImportSelector实现不同包的加载首先,定义一个需要的bean对象,比如一个monodb的配置对象

2022-04-24 17:53:36 1485

原创 springboot~注册不同级别包里的bean~scanBasePackages

对于springboot来说,它会把当前应用程序所在的包装载到ioc容器里,让使用者可以直接Autowired注入它们,一般的项目结果是这样的,这个项目包下有main方法,它将会把nacosdemo这个包里面所有的bean都扫描出来,然后在程序启动时,nacosdemo里的bean就会被自动注册了。目前我们做一个测试,在nacosdemo包外层再建立一个包common,在里面写个组件,然后在nacosdemo里去使用它,整个项目结构如下这时,项目启动后,是无法加载到你的bean的,因为它不会被扫描到

2022-04-24 17:52:19 1465

原创 nacos~配置中心功能~springboot的支持

这一次说一下如何在springboot里获取配置。dataId的组成prefix−{prefix}-prefix−{spring.profile.active}.${file-extension}依赖包 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId&gt

2022-04-24 17:51:11 602

原创 nacos~配置中心功能

nacos是阿里推出的一套基于DNS和基于RPC服务发现与注册,动态配置中心管理为一体的组件,目前在阿里产品上大为使用,而它也加入了springboot的阵营,可以在springboot上直接使用它。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。服务端

2022-04-24 17:49:43 1058

原创 logback日志文件位置动态指定

logback相关配置,其中${LOG_HOME}表示为环境变量,在java启动应用程序时,通过java -DLOG_HOME="路径"来指定的,可以动态去设置它的地址。<?xml version="1.0" encoding="UTF-8" ?><configuration>  <property name="logPath" value="${LOG_HOME-/home}/logs" /> <!-- 日志打印的格式 -->

2022-04-23 19:07:32 5415

原创 springboot~高并发下耗时操作的实现

高并发下的耗时操作官方文档中说DeferredResult和Callable都是为了异步生成返回值提供基本的支持。简单来说就是一个请求进来,如果你使用了DeferredResult或者Callable,在没有得到返回数据之前,DispatcherServlet和所有Filter就会退出Servlet容器线程,但响应保持打开状态,一旦返回数据有了,这个DispatcherServlet就会被再次调用并且处理,以异步产生的方式,向请求端返回值。这么做的好处就是请求不会长时间占用服务连接池,提高服务器的吞吐量

2022-04-23 19:06:00 974

原创 java设计模式~责任链模式

责任链,我感觉对就根据需求动态的组织一些工作流程,比如完成一件事有5个步骤,而第1步,第2步,第3步它们的顺序可以在某些时候是不固定的,而这就符合责任链的范畴,我们根据需求去设计我们的这些链条,去自己指定它们的执行顺序,下面看我的一个例子。出现的对象抽象责任具体责任抽象链条具体链条对象的解释抽象责任,也可以说是一个行为,它规定的这类行为的签名具体责任,去实现抽象责任,它就是我们上面说的每个步骤的实现抽象链条,它将会去初始化你的责任链条,提供外部调用链条的入口,但没有具体指定链条的顺序具

2022-04-23 19:04:19 122

原创 java设计模式~装饰器模式

装饰器,顾名思义,就是把一个对象的功能进行扩展,添加新的装饰,让它具有新的特性和功能,在实现生活中,有很多装饰器实现的例子,比如人类可以跑,但有一个超人它不仅可以跑,而且还可以飞,这时在不改变原对象基础上,需要为超人添加飞的动作,就可以使用装饰模式。抽象组件/** * 人类. */public abstract class Human { private String name; public String getName() { return name;

2022-04-23 19:01:31 160

空空如也

空空如也

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

TA关注的人

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