![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 82
蓝黑2020
这个作者很懒,什么都没留下…
展开
-
用jstack命令分析CPU占用率高的问题
用jstack命令分析CPU占用率高的问题原创 2023-06-08 21:15:55 · 2812 阅读 · 0 评论 -
CompletableFuture的cancel和handleAsync的一个小坑
CompletableFuture的cancel和handleAsync的一个小坑原创 2023-05-24 22:04:07 · 1380 阅读 · 0 评论 -
后端通过URLEncoder对响应内容编码
后端通过URLEncoder对响应内容编码原创 2023-04-24 22:42:51 · 550 阅读 · 0 评论 -
Java stream性能比较
Java stream性能比较原创 2023-03-20 19:17:19 · 2240 阅读 · 0 评论 -
XSS(Cross Site Scripting)攻击简介
XSS(Cross Site Scripting)攻击简介原创 2023-01-18 16:46:58 · 682 阅读 · 0 评论 -
MyBatis访问Db2和MySQL(Maven)
注:虽然前面写过一些文档,包含MyBatis连接Db2和MySQL的内容,但是貌似没有单独记录用Maven方式连接DB的文档,所以单写了这一篇文档,方便以后需要快速搭建MyBatis环境时参考。注:有一篇文档“MyBatis访问Db2小例子”,但是是用手工方式处理的各种包,比较麻烦,不像Maven,直接配置一下就搞定。原创 2022-12-13 21:28:03 · 924 阅读 · 0 评论 -
Java形参个数可变的方法
Java支持参数个数可变的方法,定义方法时,在最后一个形参后面加上3个点(...),表示该形参可以接受0个、1个、或者N个参数值。i ++) {} } }通过3个点(...)修饰的形参,即个数可变的参数,可以接受0个参数、1个参数、N个参数、或者数组作为实参;在方法里,个数可变的参数实际上是被当做数组处理的。如果没有传该参数,则数组长度为0;个数可变的参数只能位于形参列表的最后(一个方法最多只能有一个个数可变的形参);原创 2022-09-21 08:46:53 · 217 阅读 · 0 评论 -
java.io.IOException: Broken pipe
最近,在服务器的日志里发现有这样的报错消息,我在网上搜了一下,貌似是因为客户端断开了连接,于是我在本地开发环境,用JMeter尝试复现了一下。原创 2022-09-09 16:01:44 · 1857 阅读 · 1 评论 -
SpringBoot配置SpringApplication
方法运行,和前面的方式很类似。在运行之前,可以配置该实例对象。本例中,配置了懒加载,并且设置为不显示banner。可见,默认情况下,在初始化Spring时,会初始化所有singleton的bean。懒加载的效果:在初始化Spring容器时,并没有实例化任何bean,而是在。本例中,配置了懒加载,并且设置为不显示banner。对象,然后通过流式API的方式来配置,最后调用其。本例和前面的例子类似,只不过是显式的实例化了一个。SpringBoot程序的入口是。本例中,显式的实例化了一个。,全部使用默认设置。原创 2022-09-07 22:26:27 · 334 阅读 · 0 评论 -
SpringBoot自定义banner
首先找一张图片,比如:将其复制到目录下,并命名为banner.jpg。在在目录下创建banner.txt$ {其中,表示格式化的SpringBoot版本号。运行程序,控制台输出如下:注意:测试时,xxx.txt文件和inter.jpg文件位于源码目录的包下,默认情况下,不会把这两个文件复制到target目录下的对应位置(因为它们不是Java文件),需要修改pom.xml文件,设置resource目录,详见我另一篇文档。或者如果只想简单试一下,可以直接把文件复制到目标位置。原创 2022-09-03 23:55:50 · 799 阅读 · 0 评论 -
Spring加载配置(非主配置)的方法
注:本文是对前面关于Spring配置的一个总结。假如现在有一个Java配置类(非主配置类),或者有一个XML配置文件(非主配置文件),要想让Spring取加载该配置,在不同的情况下,应该怎么做呢?原创 2022-08-31 23:43:42 · 177 阅读 · 0 评论 -
Spring的component-scan XML配置和@ComponentScan注解配置
在类上添加@Component(或者其变种)注解。配置自动扫描,以下两种方式都可以:XML配置:原创 2022-08-31 23:42:16 · 2680 阅读 · 0 评论 -
Spring的setter方法注入和构造器注入的对比
setter方法注入构造器注入不可变对象无法设置为不可变可以按需设置为不可变确保所需的依赖非空无法确保可以确保代码异味(类被注入了太多对象)不容易识别很容易识别注意:对于“所需的依赖为空”的情况,也分具体情况,比如通过@Autowired给setter方法注入对象,如果找不到满足条件的类(byType),默认情况下会报错,详见我另一篇文档。所以,通过对比,我们得出结论:构造器注入就是好!...原创 2022-08-29 20:05:34 · 2177 阅读 · 0 评论 -
Spring依赖注入的几种方式(注解)
Spring依赖注入的几种方式(注解)原创 2022-08-28 20:12:46 · 1301 阅读 · 0 评论 -
JMeter简介
Apache JMeter是一个开源的Java工具,用来做功能和性能测试。它最初被设计为测试web应用,后来扩展到一些其它的功能测试。本文用JMeter做一个简单的并发HTTP请求测试。下载地址:https://jmeter.apache.org/download_jmeter.cgi我下载的文件是 。使用 解压,生成 目录。到 目录下,运行 ,就打开了JMeter程序界面:本文中我们用JMeter来测试HTTP请求,所以首先要起一个web server(比如启动一个Spring web程序)。原创 2022-06-15 23:01:09 · 544 阅读 · 0 评论 -
替换jar包或者war包里的文件
一般情况下,我们通过某种工具(比如Maven)生成 文件,或者 文件。有时希望修改里面的一个文件,比如 文件,又或者是一个配置文件,但又不想重新build整个项目,只想把这个文件塞进jar包或者war包,替换原先的文件。jar包和war包做法一样,以下以jar包为例,war包同理。具体步骤为:首先把jar包解开,一般来说,系统上的解压工具都可以使用,比如 。注意解压后的文件目录结构,例如:jar包的内容为:则解压后, 和 应该和 处于同一目录下。有些解压工具(比如Mac的 ),会多生成一原创 2022-06-15 21:50:18 · 2471 阅读 · 0 评论 -
TestNG的HelloWorld例子以及如何在命令行下运行
新建Maven项目 :打开 ,添加TestNG的依赖:在 目录下创建package ,并创建类 如下:在 目录下创建 文件如下:运行方法1:运行 文件右键单击 ,选择运行,结果如下:可见,虽然报了 的错误,不过不影响运行,这两个test方法都成功了。右键单击 ,选择运行。从右侧Maven面板双击 :官网上原话是:这句话说的很含糊,我折腾了半天才弄明白是怎么回事。以下是调试过程,记下来以便日后复习时,知其所以然。在项目根目录下:这里,我添加了classpath是因为在原创 2022-06-08 15:21:11 · 870 阅读 · 0 评论 -
Java程序的启动选项
环境操作系统:Ubuntu 20.04JDK:17.0.1开发工具:IntelliJ IDEA 2022.1 (Community Edition)原创 2022-05-11 20:55:16 · 1513 阅读 · 0 评论 -
JDK自带的java.util.logging.Logger
环境操作系统:Ubuntu 20.04JDK:17.0.1Java自带log功能,用的是JDK标准库中的类java.util.logging.Logger 。下面是一个简单的例子:package pkg1;import java.util.logging.*;public class Test0509 { public static void main(String[] args) { Logger logger = Logger.getLogger(Test0原创 2022-05-09 17:55:39 · 2057 阅读 · 1 评论 -
Spring Boot的Spring Data Redis和RedisTemplate(StringRedisTemplate)
Spring Boot提供了 spring-boot-starter-data-redis 使用Spring Data Redis对底层的 Lettuce 或者 Jedis 做了封装,默认使用 Lettuce 。配置打开 https://start.spring.io/ ,搜索 redis ,添加依赖 Spring Data Redis (Access+Driver) ,如下图所示:创建项目 test0501_1 ,下载 test0501_1.zip 文件,解压生成项目,并打开。打开 pom.xm原创 2022-05-04 11:50:49 · 1413 阅读 · 0 评论 -
Redis的Java客户端Lettuce简介
环境操作系统:Ubuntu 20.04Redis:6.2.6开发工具:IntelliJ IDEA 2022.1 (Community Edition)Lettuce的官网( https://lettuce.io/core/release/reference/index.html )对Lettuce的描述是: Lettuce is a scalable thread-safe Redis client based on netty and Reactor. Lettuce provides syn原创 2022-04-30 19:55:19 · 1748 阅读 · 0 评论 -
在Java项目中配置Redis
环境:操作系统: Ubuntu 20.04Redis:6.2.6开发工具:IntelliJ IDEA 2022.1 (Community Edition)Redis官网( https://redis.io/docs/clients/#java )所推荐的Java客户端有:RedissonJedislettuce等等。本文将介绍 Jedis 和 lettuce 。Jedis方法1:手工配置即手工搜索并下载所需的jar包,可以到以下网站搜索:https://mvnreposit原创 2022-04-30 09:21:44 · 4908 阅读 · 0 评论 -
MyBatis传递参数的几种方法
环境Db2:V11.5MyBatis:3.5.6现有table T1 如下:[db2inst1@ruili1 ~]$ db2 "select * from t1"C1 C2 C3----------- ----------- ---------------------------------------------------------------------------------------------------- 1原创 2022-04-20 11:37:49 · 1032 阅读 · 0 评论 -
Java POJO映射
问题考虑以下典型的应用场景:用户点击按钮发送一个请求,从后台获取一些数据,展示在页面上。通常情况下,应用在从数据库查询数据时,会把获取到的结果集(ResultSet)映射为POJO的List。例如,把 select * from t1 的resultset映射为 List<MyPojo> 对象。接下来,可能对该List进行各种操作,比如计算(calculation),过滤(filter),聚集(aggregation),排序(sorting),截取(limit&offset),转换(原创 2022-03-30 23:53:35 · 1546 阅读 · 0 评论 -
Java新版本特性(9到17)
最近一段时间,项目组终于打破了“你发任你发,我用Java8”的传统,准备升级到Java 17,所以我也来学习一下Java新版本的特性,看看给Java 17(其实是9到17)我们带来了哪些新功能。https://docs.oracle.com/en/java/javase/17/language/java-language-changes.htmlrecord (Java 16)record 是一种特殊的类,它是简单的数据聚集的建模,比传统意义上的数据类减少了很多“繁文缛节”。这些繁文缛节,包含了访问原创 2022-02-26 22:37:18 · 2090 阅读 · 2 评论 -
使用不同方式向MySQL插入数据的性能比较
环境MySQL~ mysql --versionmysql Ver 8.0.28-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))MyBatismybatis-3.5.9.jarDBrepomysql> use repoDatabase changedTablet2mysql> describe t2;+-------+------------+------+-----+---------+-------+原创 2022-02-13 11:11:34 · 548 阅读 · 0 评论 -
MyBatis基本概念
ORM 的全称是 Object/Relation Mapping ,即 对象/关系映射 。顾名思义,它表示面向对象的编程语言(如Java)和关系型数据库(如Db2)之间的映射。简单讲,开发项目时,使用的是面向对象的分析、设计、编码,而持久层使用的是关系型数据库,于是产生了ORM框架,把关系型数据库包装成面向对象的模型。从而开发人员可以以面向对象的方式操作持久化对象,如保存、删除、修改,而ORM框架将其转换为对应的SQL操作,如insert、delete、update。OR原创 2022-02-11 22:53:47 · 1075 阅读 · 0 评论 -
MyBatis访问Db2小例子
环境Db2$ db2levelDB21085I This instance or install (instance name, where applicable:"db2inst1") uses "64" bits and DB2 code release "SQL11050" with levelidentifier "0601010F".Informational tokens are "DB2 v11.5.0.0", "s1906061700", "DYN1906061700AMD64原创 2022-02-09 17:53:17 · 1630 阅读 · 0 评论 -
Db2插入数据溢出报错测试
测试环境Db2$ db2levelDB21085I This instance or install (instance name, where applicable:"db2inst1") uses "64" bits and DB2 code release "SQL11050" with levelidentifier "0601010F".Informational tokens are "DB2 v11.5.0.0", "s1906061700", "DYN1906061700AMD原创 2022-02-07 17:49:49 · 5096 阅读 · 0 评论 -
使用JWT的Spring Security小例子
JWT介绍和Spring Security的小例子都有了,接下来,我们来编写一个使用JWT作为验证方式的Spring Security的小程序。本文是上一篇Spring Security小例子的扩展,区别在于:使用JWT token使用MySQL数据库存储信息代码本文的具体源代码请参考 https://github.com/dukeding/spring-boot-security-jwt_0116注意事项该程序使用了MySQL数据库,所以请先在运行环境中安装并配置好MySQL。注意,在原创 2022-01-18 22:18:20 · 688 阅读 · 0 评论 -
Java发送mail报错“java.util.ServiceConfigurationError: com.sun.mail.imap.IMAPProvider not a subtype”
背景最近遇到一个诡异的发送邮件的问题,特记录之。现有代码中已有 EmailUtils 类,并提供了static方法 sendEmail() ,在多个模块中被调用,一直运行良好。现在要在另一个模块里添加发送邮件功能。把代码copy过来,稍微修改一下title,content,sender之类的参数,代码基本上大同小异。在本机测试一下 main() 方法,工作OK。然而,当我本地起server运行的时候(Java web project),却发现没有收到mail。分析我在调用 sendEmail()原创 2021-11-24 15:47:12 · 2910 阅读 · 1 评论 -
JDK动态代理
静态代理package package0906;public class StaticProxy implements Fruit { private Fruit target; public Fruit getTarget() { return target; } public void setTarget(Fruit target) { this.target = target; } @Override原创 2021-09-07 21:45:49 · 60 阅读 · 0 评论 -
Java泛型小结
所谓泛型,就是在定义类、接口、方法的时候使用“类型形参”,而在真正使用类、接口、方法的时候,动态的指定实参(也就是指定某一种类型,或者用通配符来通配多种类型)。泛型类例如,使用泛型定义 Foo 类:class Foo<T> { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; }}使用 Foo 类:p原创 2021-08-29 20:37:07 · 83 阅读 · 0 评论 -
最简单的AOP程序
环境操作系统:Ubuntu 20.04开发工具:IntelliJ IDEA 2020.1.2 (Community Edition)JDK:➜ ~ java -versionopenjdk version "14.0.1" 2020-04-14OpenJDK Runtime Environment (build 14.0.1+7-Ubuntu-1ubuntu1)OpenJDK 64-Bit Server VM (build 14.0.1+7-Ubuntu-1ubuntu1, mixed原创 2021-08-17 21:15:40 · 205 阅读 · 0 评论 -
用递归实现Stack元素逆序排列
题目将一个Stack里面的所有元素反转,也就是逆序排列,要求不能使用其它容器。分析如果能使用另外一个Stack,那就简单了,只需将该Stack中的元素依次pop出来,并push到另一个Stack里面即可。 while (!stack1.empty()) stack2.push(stack1.pop());但是题目要求不能使用其它容器,这就相当有难度了。假设Stack的元素是 [1, 2, 3, 4, 5] ,想要变为 [5, 4, 3, 2, 1] ,倒过原创 2021-04-18 08:44:44 · 481 阅读 · 1 评论 -
简单的数独小程序
昨天和孩子一起做数独游戏,竟然连入门级的第一道题都做不出来。一怒之下,写了一个小程序,帮助我们做一些简单的分析和判断。数独的解题技巧当某一行、某一列、某一宫中已经出现了8个数字,则余下的一格一定是第9个数字。例1:258?14796则 ? 处一定是 3 。例2:123?48657则 ? 处一定是 9 。例3:11原创 2021-04-11 11:56:49 · 2411 阅读 · 0 评论 -
CompletableFuture的正常,异常,timeout和cancel
背景Java 8的CompletableFuture提供了强大的task管理能力,比如通知机制,以及更加简单抽象的task管理。本文中,将用CompletableFuture的 supplyAsync() 方法来创建一个异步task,task会完成特定的工作,并且返回一个String。下面的 handleResult() 方法作为task完成时的回调函数(注意:task完成并不意味着task的实际工作一定已经运行结束了,比如timeout和cancel场景)。 public static vo原创 2020-07-24 18:26:58 · 7385 阅读 · 0 评论 -
使用CompletableFuture构建异步应用 (2)
(接上文)现在,我们假设每张饼都需要烙正、反两面,每一面烙熟需要1秒钟:package package0614;import java.util.Random;public class Dabing2 { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Dabing原创 2020-06-14 23:12:17 · 200 阅读 · 0 评论 -
使用CompletableFuture构建异步应用 (1)
背景烙熟一张饼,需要正反面各烙1分钟。现在有一个铁锅,同时最多容纳2张饼。现在想要烙熟3张饼,问最少需要多长时间?答:最少需要3分钟。假设3张饼分别为A、B、C,每张饼有x、y两面。第1种做法:Ax + Bx => Ax + By => Cx => Cy则一共需要4分钟。第2种做法:Ax + Bx => Ay + Cx => By + Cy则一共只需要3分钟。点评:第1种做法的缺点在于,在第3分钟的时候,C饼有两面要烙,铁锅也...原创 2020-06-14 20:55:28 · 159 阅读 · 0 评论 -
Eclipse 导入《Java编程思想》源码
环境OS:CentOS 8 IDE:EclipseVersion: 2020-03 (4.15.0)Build id: 20200313-1211JDK:$ java -versionjava version "1.8.0_251"Java(TM) SE Runtime Environment (build 1.8.0_251-b08)Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)python原创 2020-06-14 18:38:18 · 366 阅读 · 0 评论