- 博客(46)
- 收藏
- 关注
原创 POI实现导出动态Excel表格(前端可选择导出列)
public class DynamicExcelUtil { /** * 反射获取数据中指定字段的值 * @param clazz * @param obj * @param fieldName * @return */ public static Object getMethodVal(Class<?> clazz, Object obj, String fieldName) { try {
2022-03-22 17:34:35
1630
1
原创 swagger2 注解使用
@RestController@RequestMapping("/applet/message")@Api(value = "小程序消息推送接口", tags = {"小程序消息推送接口"})public class AppletSendMessageConrtoller { @Autowired private WxMaProperties wxMaProperties; @Autowired private AppletSendMessageService ap
2022-03-07 17:18:33
349
转载 MyBatis 关于${}、#{}, 这个坑真不小~
MyBatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单;一个成熟的框架,必然有精巧的设计,值得学习。在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式:${paramName}#{paramName}那如何理解这两种传参方式呢?如下带你走近背后的奥义。先来回顾下原生Jdbc查询:public static void main(String[] args) throws Exception { // sql语句 String sql = "sel
2021-09-28 10:19:09
1060
1
转载 HTTP和HTTPS的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
2021-08-31 10:34:03
145
转载 Synchronized与ReentrantLock区别总结
相似点这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善)。功能区别这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,
2021-08-30 10:54:13
315
转载 什么是 CAS ?
我们先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次。最终输出的count结果一定是200吗?因为这段代码是非线程安全的,所以最终的自增结果很可能会小于200。我们再加上synchronized同步锁,再来看一下。加了同步锁之后,count自增的操作变成了原子性操作,所以最终输出一定是count=200,代码实现了线程安全。虽然synchronized确保了线程安全,但是在某些情况下,这并不是一个最有的选择。关键在于性能问题。synchronized关键字会让没有得到
2021-08-23 15:07:33
209
1
转载 创建线程的几种方式
Java中创建线程主要有三种方式:一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。public class FirstThreadTest extends Thread { int i = 0; //重写run方法,run方法的方法体就是现场执行体
2021-08-23 09:46:48
17896
1
转载 如何理解JVM的强、软、弱、虚引用?
整体架构强引用强引用是默认支持,当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会回收对象。强引用是最常见的普通对象引用,只要还有强引用指向对象,对象就存活,垃圾回收器不会处理存活对象。一般把一个对象赋给一个引用变量,这个引用变量就是强引用。当一个对象被强引用变量所引用,它就处于可达状态,是不会被垃圾回收的,即使之后都不会再用到了,也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。对于一个普通对象,如果没有其他引用关系,只要超过了引用的作用域或者显式地将相应
2021-08-19 09:44:56
100
原创 springsecurity调用不同微服务报401的问题
场景在开发中本模块需要调用用户的 feign接口来获取用户信息,但是出现了401,原因是在访问其它模块微服务时没有携带token令牌.解决方法在调用服务中新建FeignConfig类并实现RequestInterceptor接口,重写apply方法。public class FeignConfig implements RequestInterceptor { @Override public void apply(RequestTemplate requestTe
2021-08-16 09:58:48
1654
转载 fail-fast(快速失败) 与 fail-safe(安全失败) 机制有什么区别
在我们详细讨论这两种机制的区别之前,首先得先了解并发修改。1.什么是并发(同步)修改?当一个或多个线程正在遍历一个集合Collection,此时另一个线程修改了这个集合的内容(添加,删除或者修改)。这就是并发修改。2.什么是 fail-fast 机制?在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCoun
2021-08-11 10:17:52
198
转载 Java 逃逸分析
引入记得几年前有一次栈长去面试,问到了这么一个问题:Java中的对象都是在堆中分配吗?说明为什么!当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在考什么知识点,难道对象不是在堆中分配吗?最后就没然后了,回去等通知了。。这个面试题很经典,我最近也分享到了知识星球上面:什么是逃逸分析什么是逃逸分析?关于 Java 逃逸分析的定义:逃逸分析(Escape Analysis)简单来讲就是,Java Hotspot 虚拟机可以分析新创建对象的使用范围,并决定是否在 Java 堆上分配
2021-08-09 16:46:41
313
转载 JAVA8 之 StringJoiner
前几天偶然看到jdk1.8突然新增了一个类StringJoiner , 就研究了一下是怎么使用的,作用:运用了StringBuilder的一个拼接字符串的封装处理1. StringJoiner 基本使用(1) StringBuffer 拼接字符串StringBuilder sb = new StringBuilder();sb.append("hello");sb.append(",");sb.append("world");sb.append(",");sb.append("J
2021-08-09 15:33:00
316
转载 java异常:(实例分析)try-catch-finally 中哪个部分可以省略?如果 catch 中 return 了,finally 还会执行吗?return的执行顺序?
1. try-catch-finally 中哪个部分可以省略?以下三种情况都是可以的:try-catchtry-finallytry-catch-finally可以省略catch或者finally。catch和finally不可以同时省略。2. 如果 catch 中 return 了,finally 还会执行吗?答案:会。(1)finally的作用就是,无论出现什么状况,finally里的代码一定会被执行。(2)如果在catch中return了,也会在return之前,先执行finally
2021-08-09 14:01:56
3830
转载 RandomStringUtils工具类用法
Maven依赖<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version></dependency>测试代码 public static void main(String[] args) { //从
2021-08-09 10:12:52
319
转载 20 个实例轻松玩转 Java 8 Stream
引入先贴上几个案例,水平高超的同学可以挑战一下:从员工集合中筛选出salary大于8000的员工,并放置到新的集合里。统计员工的最高薪资、平均薪资、薪资之和。将员工按薪资从高到低排序,同样薪资者年龄小者在前。将员工按性别分类,将员工按性别和地区分类,将员工按薪资是否高于8000分为两部分。用传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相比高下立判。一. Stream 概述Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给
2021-08-05 17:11:31
62
转载 Colletions 的 emptyList( ) 和 EMPTY_LIST的区别
1.场景需求我们在开发时,某个方法返回的结果集可能不存在,可能会返回null,为了避免在调用这个方法时做null判断,我们往往会在方法返回结果为null时返回一个空集合,return new ArrayList<T> resultList这样固然可以,但是每次我们new 一个集合对象的时候都会有一个初始化空间,占用内存资源,积少成多会浪费很多的资源,这时候我们就可以使用Collections的emptyList( ) 方法或者EMPTY_LIST。Collections中的空集合对象是
2021-07-28 15:08:12
243
原创 Java中如何对汉字进行字典序排序
场景需求需要给前端返回一个有序的集合,且用来排序的字段包括中文汉字Collator类介绍公共抽象类Collatorextends Object实现了Comparator < Object >,CloneableCollator类用于执行区分语言环境 String比较。您可以使用此类为自然语言文本构建搜索和排序例程。Collator是一个抽象基类。子类实现特定的整理策略。一个子类 , RuleBasedCollator当前随 Java 平台一起提供,并且适用于多种语言。可以创建其
2021-07-28 14:37:19
3122
原创 开发环境搭建文档
云管部署文档v1.1 2021-07-12一. 安装JDK1. 查看系统是否携带OpenJDK, 是则卸载1.1 查看java 版本[root@CSSMP /]java -version# 2. 如果是以下这种结果, 则携带openjdk version "1.8.0_262"OpenJDK Runtime Environment (build 1.8.0_262-b10)OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
2021-07-28 14:23:10
459
转载 Linux 解决每次重启后要 source/etc/profile
一、问题出现今天在Linux中安装jdk后, 发现每次使用jdk都要重新执行 source /etc/profile 命令,使该文件生效才可以使用jdk(非常麻烦),所以上网查找解决办法,具体解决办法请继续向下看。二、解决办法方法一在 ~/.bashrc 里面加一句 source /etc/profile ,然后执行一次 source ~/.bashrc 使该文件生效即可。方法二直接将配置语句写在 ~/.bashrc 里面,然后执行一次 source ~/.bashrc 使该文件生效即可。.
2021-07-09 17:45:55
1509
转载 Shiro 实战教程(一) Shiro 认证
一. 权限的管理1. 什么是权限管理基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。2. 什么是身份认证身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中
2021-07-07 15:11:05
182
原创 Java 和 Springboot 整合 Redis
一. Java 操作 Redis1. 环境准备引入依赖<!--引入jedis连接依赖--><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version></dependency>创建 jedis 对象 public static voi
2021-06-25 15:46:49
100
转载 Redis系列(二) Redis的基本操作与持久化机制
一. Redis常⽤数据类型以及应⽤场景1. String 类型介绍string是Redis最基本的类型,⼀个key对应⼀个value,⼀个键最⼤能存储512MB。string类型是⼆进制安全的。意思是Redis的string可以包含任何数据。⽐如jpg图⽚或者序列化对象。⼆进制安全是指,在传输数据时,保证⼆进制数据的信息安全,也就是不被篡改、破译等,如果有被攻 击,能够及时检测出来 跟Java的map ⾮常类似。Value是字符串。语法案例SET key valueGET keyI
2021-06-25 15:18:28
122
原创 Redis系列(一) Redis的介绍与安装
一. NoSQL的引言NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。二. 为什么是NoSQL随着互联网网站的兴起,传统的关系数据库在应付动态网站,特别是超大规模和高并发的纯动态网站已经显得力不从心,暴露了很多难以克服的问题。如商城网站中对商品数据频繁查询、对热搜商品的排行统计、订单超时问题、以及微信朋友圈(音频,视频)存储等相关使用传统的关系型数据库实现就显得非常复杂,虽然能实现相应功能但是
2021-06-23 14:24:27
88
原创 Java对象-深拷贝(实现Serializable, Cloneable两种方式)
一. 使用序列化流实现方法实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。实体类 Schoolpackage entity;import java.io.*;import java.util.List;public class School implements Serializable { private List<Student> students; private String sclNo; p
2021-06-21 16:08:02
1182
2
转载 Java理解误区——方法的重载是多态性的一种体现?
理解误区面试题 :“方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。”方法的重载是多态性的一种体现吗? 其实这是一个误区,让我很长的一段时间都理解错了,直到
2021-06-21 11:51:21
2858
转载 理解和正确使用Java中的断言(assert)
一、语法形式:Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的语法形式有如下所示的两种形式:(1)assert [boolean 表达式]如果[boolean表达式]为true,则程序继续执行。如果为false,则程序抛出AssertionError,并终止执行。(2)assert[boolean 表达式 : 错误表达式 (日志)]如果[boolean表达式]为true,则程序继续执行。如果为false,则程序抛出java.l
2021-06-21 09:49:04
1189
转载 为什么volatile只能保证有序性不能保证原子性
摘自: https://www.cnblogs.com/simpleDi/p/11517150.html对于内存模型的三大特性:有序性、原子性、可见性。大家都知道volatile能保证可见性和有序性但是不能保证原子性,但是为什么呢?一、原子性、有序性、可见性1、原子性:(1)原子的意思代表着——“不可分”;(2)在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。原子性是拒绝多线程交叉操作的,不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。例如 a=1是原子性
2021-06-18 15:42:13
389
原创 Comparable 接口和 Comparator 接口的区别
1. Comparator 和 Comparable 相同的地方他们都是java的一个接口, 并且是用来对自定义的实体类比较大小的,当我们有这么一个personList,里面包含了 person1, person2, persion3…, 我们用Collections.sort( personList ), 是得不到预期的结果的. 这时肯定有人要问, 那为什么可以排序一个字符串list呢:如 StringList {“hello1” , “hello3” , “hello2”}, Collection
2021-06-09 09:48:13
1957
原创 Comparable 接口的使用
接口 Comparable此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。方法详细信息compareToint compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整
2021-06-09 09:25:48
4575
原创 浅析 AutoCloseable 接口
一. AutoCloseable接口由来从AutoCloseable的注释可知它的出现是为了更好的管理资源,准确说是资源的释放,当一个资源类实现了该接口close方法,在使用 try-catch-resources 语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放,当没有抛出异常正常退出try-block时候也会调用close方法。像数据库链接类Connection,io类InputStream或OutputStream都直接或者间接实现了该接口。二. 认识 AutoCloseab
2021-06-09 08:57:38
247
原创 Java mutable 和 immutable 类型
含义immutable : variables that are assigned once and never reassigned.mutable : When you assign to a variable or a field, you’re changing where the variable’s arrow points. You can point it to a different value. When you assign to the contents of a mutable
2021-05-31 16:09:51
215
原创 微服务系列(六) 服务熔断与服务降级
一. 背景分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。二. 服务雪崩在微服务之间进行服务调用是由于某一个服务故障,导致级联服务故障的现象,称为雪崩效应。雪崩效应描述的是提供方不可用,导致消费方不可用并将不可用逐渐放大的过程。图解雪崩效应如存在如下调用链路
2021-04-16 16:43:19
2405
转载 微服务系列(五) 服务网关
一. 网关简介1.说明网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。2.为什么需要网关网关可以实现服务的统一管理网关可以解决微服务中通用代码的冗余问题(如权限控制,流量监控,限流等)3.网关组件在微服务中架构...
2021-04-09 09:29:12
338
转载 MySql 8.0 窗口函数
一. 场景需求日常开发工作中,经常会遇到以下需求 :去医院看病,怎样知道上次就医距现在的时间?环比如何计算?怎么样得到各部门工资排名前N名的员工列表?如何查找组内没人工资占总工资的百分比?如果使用传统的SQL来解决这些问题,理论上都是可以的,但逻辑会相当复杂。这类需求都有一个共同的特点,未来得到结果,都需要在某个结果集内做一些特定的函数操作。为了来很方便的解决这一类问题,MySql 8.0 引入了窗口函数。窗口函数在其它数据库,比如Oracle中也称为分析函数,功能大体类似。二. 窗口函数
2021-03-24 13:48:39
151
原创 使用RestTemplate实现跨服务大文件上传
问题描述开发场景中需要向 opestack 上传几个 GB 大小的镜像文件,出现了 OOM 情况,配置了 JVM 参数后问题仍未解决。java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) at java.io.ByteA
2021-03-15 15:24:52
1034
原创 微服务系列(四) 服务调用篇
接下来在整个微服务架构中,我们比较关心的就是服务间的服务改如何调用,有哪些调用方式?总结:在springcloud中服务间调用方式主要是使用 http restful 方式进行服务间调用一. 基于RestTemplate的服务调用spring 框架提供的 RestTemplate 类可用于在应用中调用 rest 服务,它简化了与http 服务的通信方式,统一了 RESTful 的标准,封装了 http 链接, 我们只需要传入 url 及返回值类型即可。相较于之前常用的 HttpClient,Rest
2021-03-10 11:11:27
1158
原创 基于 Hibernate Validator 实现参数校验
引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency>配置类package com.dp.fw.config;import org.hibernate.validator.HibernateValidator;
2021-03-09 09:42:54
137
原创 基于 @RestControllerAdvice 注解的全局异常处理
简介在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice 文档。@RestControllerAdvice = @ResponseBody + @ControllerAdvice用法@RestControllerAdvicepublic class GlobalDefultExceptio
2021-03-08 16:39:22
329
原创 微服务系列(三) 服务注册中心篇
一.什么是服务注册中心所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用可以对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例。二.常用服务注册中心1. Eureka#1. 简介https:
2021-03-08 11:43:42
792
1
转载 微服务系列(二) Spring Cloud简介
一.什么是Spring Cloud官方定义官方网址:https://cloud.spring.io/spring-cloud-static/Hoxton.SR5/reference/html/Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management,service discov
2021-03-04 14:39:56
114
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人