Java
文章平均质量分 84
fenglllle
这个作者很懒,什么都没留下…
展开
-
@Configuration自身循环依赖及解决办法
实际上循环依赖不仅是Spring Bean的循环依赖,还有接口调用的循环依赖,不过Springboot在2.6.0版本已经默认不允许循环依赖,就是不解决这个问题了,如果spring.main.allow-circular-references配置true,那么还是可以跟以前一样,不过不确定什么时候就移除这个配置。另外自身循环依赖比较特别,主要是Springboot下动态代理的结果,本身方法的引用是不会出现循环依赖的。原创 2024-05-04 16:54:42 · 1115 阅读 · 0 评论 -
Maven插件打fatjar的一些技巧
最近做项目,Java实际上一般情况也不用fatjar,毕竟CICD都是流水线构建,不过在预研的过程中,使用fatjar可以内置manifest的main类直接启动,就很方便,尤其是在服务器运行环境。实际上golang还是很方便的,可以交叉编译二进制可执行文件,不过在交叉编译跨语言的能力的时候经常很难弄环境。实际上工作中大部分Java项目都是通过这种jar方式来来执行的,当然也可以封装java class -cp xxx的方式执行,不过文件太分散,不便管理。原创 2024-04-07 18:49:12 · 1488 阅读 · 0 评论 -
sonar-java 手写一个规则-单元测试分析
最近做项目,定制sonar规则,提高Java代码质量,在编写的sonar规则,做验证时,使用单元测试有一些简单的心得感悟,分享出来。sonar的自定义规则很简单,一般而言有2种模式可以使用:1. 自定义扫描代码逻辑,并对分类的Tree的结构处理2. 使用已扫描的分类,对分好类的Tree进行分析。原创 2024-02-25 15:09:54 · 1860 阅读 · 0 评论 -
sonar-java 自定义规则
最近在搞代码质量方面的项目,主要是针对Java语言,其他语言实际上也可以执行检查,核心原理是一样的,都是静态代码扫描,如果需要进行动态代码运行验证则可以通过单元测试的方式。以其中一个示例,实现自定义Java sonar规则。实际上这个很简单,如果需要考虑,那么需要考虑扫描算法怎么写,性能是否OK,毕竟一般执行扫描都是在代码编译打包的过程,本地很少单独执行扫描。原创 2024-02-18 17:58:58 · 1969 阅读 · 0 评论 -
mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑
mybatis plus这个是直接丢弃相同Id的statement,安装先后顺序,会造成执行过程的误解,不过有日志可以查看,而且mybatis原生的starter是有校验的,直接报错了。mybatis的xml如果写错,那么启动居然不报错,执行任意statement前需要执行未完成的statement,来达到快速失败的情况,这种情况对健康检查提出了新挑战,否则可能出现启动OK,但是mybatis失败的情况。原创 2024-01-09 22:46:08 · 1037 阅读 · 0 评论 -
Spring多个条件注解不同但BeanId相同的冲突
这个问题实际上出现不是很频繁,但是如果不经意就会出现我们不可预知的问题,尤其是初始化的情况,不同条件初始化绝对不一样,出现这种问题,我们很难知道根源,因为异常被吞了,启动也OK。当然解决问题是不使用id相同的Bean创建方式,因为如果异常,只要其中一个Bean创建成功即可成功,没异常我们发现不了问题;如果没有异常,相同的Bean id会被后创建的Bean替代,但是在相同id的时候是都会尝试创建,@ConditionOnXxx就不会执行,这个会跟我们需要的情况相违背。原创 2023-12-03 22:08:28 · 1235 阅读 · 0 评论 -
logback异步日志打印阻塞工作线程
实际上这个问题是使用问题,非常简单,不过越是简单的使用,却可能出现致命问题,一般公司都会统一脚手架或者统一规范的方式来实现标准的日志配置文件,防止错误配置导致业务问题,不知道未来Java虚拟线程大规模使用会不会缓解日志打印阻塞工作线程的问题,毕竟调度更优,不过如果线程池满载,虚拟线程也是无能为力。还是需要在丢日志和存储消费日志的能力作取舍。原创 2023-11-12 16:59:23 · 2399 阅读 · 0 评论 -
Java SSL/TLS证书认证逻辑
实际上证书的认证就是链式认证,加入根证书链,因为根证书是信任的,CA机构是认可的,那么CA颁发的根证书是信任的,经常报道的Chrome移除xxx机构颁发的根证书,表示这些证书链下的证书不信任了,毕竟公钥和私钥任何证书都能生成,证书链也可以仿造。原创 2023-10-21 14:49:06 · 2135 阅读 · 0 评论 -
Spring Cloud zuul与CloseableHttpClient连接池,TLS证书认证
实际上,对于技术而言,无论使用任何框架,设计思路都是有异曲同工的地方,对于HTTP代理,无论是zuul(servlet)还是gateway(netty),或者NGINX;本质处理逻辑还是IO的区别,HTTPS协议对于所有的逻辑都是一样的,关键在于定制化吧,zuul对于简单应用还是很不错的,方便定制化,也可以使用gateway,相对要复杂一点。原创 2023-09-08 19:58:44 · 393 阅读 · 0 评论 -
SLF4J日志绑定原理分析
最近做项目,实际上也知道日志冲突的事,不过涉及MDC NDC数据传递,当日志框架冲突后,MDC和NDC就失效了,这里就涉及slf4j-api的MDC的绑定的过程,顺便分析了日志冲突实际生效的原因,理解SLF4J的设计思想。SLF4JSimple Logging Facade for Java(SLF 4J)作为一个简单的facade或抽象,用于各种日志框架(例如logback、log4j2),从而允许最终用户在部署时插入所需的日志记录框架。简称门面模式,就是接口外加绑定实现。原创 2023-08-12 16:37:13 · 523 阅读 · 0 评论 -
Java文件的相对路径规则
最近做项目,又涉及到Linux Java文件的相对路径,但是相对路径在不同的服务器或者docker上居然不一样,这个就很难受,只能用绝对路径解决,因为绝对路径是固定的路径,但是相对路径为什么会在不同的服务器不一样呢?原创 2023-07-24 16:36:04 · 592 阅读 · 0 评论 -
OpenRASP agent源码分析
目录前言准备源码分析1. manifest 2. agent分析3. agent卸载逻辑 总结笔者在很早前写了(231条消息) OpenRASP Java应用自我保护使用_fenglllle的博客-CSDN博客实际上很多商业版的rasp工具都是基于OpenRASP的灵感来的,主要就是对核心的Java类通过Javaagent技术,对特定的方法注入字节码,做参数验证。核心技术就是Javaagent,那么分析OpenRASP的agent实现原理,即可明白主流的rasp实现逻辑。 在OpenRASP上优化部分实现逻原创 2022-12-04 13:14:28 · 763 阅读 · 0 评论 -
grpc Java demo与Springboot改造支持grpc通信
最近调研grpc的情况,发现grpc实际上还是HTTP2协议,实际上就是http2+proto传输。那么是否可以在现有的server支持呢,试了下,还真可以,但是笔者在返回数据时有个问题一直没有思路。原创 2022-11-13 11:50:36 · 1181 阅读 · 0 评论 -
macOS 下JD-GUI报JDK1.8+的问题
这里不就是jvm的版本不对,那么设置版本号即可,也可以写的灵活一点,执行java -version。注意=号两边不能有空格,shell基本常识。实际上是sh脚本获取的jdk的版本不对。然后取第一行第3列的值。原创 2022-11-06 23:01:02 · 1105 阅读 · 0 评论 -
intellij idea在macOS下卡顿的问题解决方法
不知道从什么时候开始intellij idea的run和debug Springboot项目时非常卡,经常要卡顿很久才能启动,笔者只以为是idea的优化不太好,但是通过搜索,发现很多提问卡顿的,有说退回2018版本就不卡了。也有说配置jvm的堆大小的,但是笔者配置堆大小没用。...原创 2022-08-26 22:34:49 · 3301 阅读 · 0 评论 -
java File AbsolutePath的路径不正确
最近做项目,出现一件特别不能理解的事情,文件的实际路径与绝对路径差别很大。其中绝对路径差距很大。不知道为什么File的AbsolutePath要取系统变量,而实际文件的地址确实另外的地址,这很容易导致文件路径不对,导致读取不到。httpshttpshttpshttps。......原创 2022-07-19 21:54:17 · 1217 阅读 · 0 评论 -
Java 双工通信与websocket协议
最近做项目,需要双工通信,考虑http协议,但是是单向的通信,只能请求响应,不能从服务端推送,如果要服务器推送,方式有很多,http轮训,长轮训,websocket等,实际上tcp传输层是双向通信的,原始的socket就可以实现。现在最常用的是websocket,因为可以复用http的底层tcp连接,方便,当然http3使用udp通信,基于QUIC保证连接可靠。...原创 2022-06-26 12:01:53 · 1134 阅读 · 0 评论 -
Properties load方法 中文乱码
properties中文load乱码,properties是怎么加载的,Unicode是怎么转码的原创 2022-06-15 21:57:50 · 1884 阅读 · 0 评论 -
openJDK 官方二进制下载
前言由于Oracle的jdk收费license,JDK8 201~221开始不免费了,目前有最近的JDK17 LTS明确免费了,但是不确定什么时候会修改协议,而且升级jdk也不能从jdk8升级到jdk17吧,LTS版本有8/11/17,目前即使升级也先升级jdk11,所以openjdk就是完美的替代品,openjdk基于License:GPLv2然而openjdk并没有发布二进制包,难道源码编译,实际上openjdk官网推荐了二进制包的安装地址。步骤1. 打开OpenJDK (ja.原创 2022-05-15 20:19:40 · 3762 阅读 · 0 评论 -
OpenRASP Java应用自我保护使用
前言笔者上一章写了编译openrasp-v8的JNI编译过程,实际上是百度开源的OpenRASP的引擎依赖包,简单体验了,基础功能非常不错,只是很多管理功能需要2次开发,体验了以下,分享过程。1. RASP与WAFRASP(Runtime application self-protection)运行时应用自我保护,将自身注入到应用程序中,与应用程序松耦合,进行实时监测、阻断攻击。对于JAVA而言,应用本身通过javaagent技术注入agent来实现,原有代码无需修改。实际上WAF的部分功能原创 2022-03-20 17:02:27 · 9870 阅读 · 0 评论 -
openrasp-v8 Java macOS环境编译
前言openrasp是百度开源的主动式防御插件,与业务松耦合,在Java语言是使用javaagent的方式注入的,笔者前几章讲过javaagent的实现原理,笔者在使用openrasp的时候,发现openrasp-v8是快照版,并且依赖JNI实现,需要对不同的硬件与操作系统编译特定的函数库。1. 准备cmake指令macOS推荐brew安装,非常方便:brew install cmakemvn指令maven管理,配置maven的path即可,开发人员常识。git指令Git原创 2022-03-17 18:52:54 · 1229 阅读 · 1 评论 -
jar冲突问题与Tomcat 加载jar的顺序
前言笔者在解决业务问题的时候,很多业务提出了为啥我的服务在测试环境啥问题都没有,发布生产就出问题了,第一反应是配置不一样?????实际上部分原因可能还与发布的容器有关,比如Tomcat8,比如jar冲突。刚好解决了jar冲突的事情,总结分析原因。1. tomcat源码下载Tomcat的新版本是可以直接下载源码的,但是Tomcat7就只能Index of /dist/tomcat (apache.org)记得下载src2. tomcat 7与tomcat 8的区别以非嵌原创 2022-01-10 23:11:14 · 2936 阅读 · 0 评论 -
javaagent技术原理
前言说道Javaagent是最近经常在使用这个技术,顺便了解了原理与根源,实际上就是jvm开个代理字节码修改的instrument接口。但实际上使用,根据使用的方式不同而略有区别。1. Javaagent使用实际上,笔者在前段时间写了arthas的启动原理(83条消息) arthas 启动原理分析_fenglllle的博客-CSDN博客,简单的说明了Javaagent的2种方式,jvm参数方式与动态attach。2. Javaagent原理3. idea debug总结..原创 2021-12-11 15:04:56 · 4430 阅读 · 1 评论 -
JVM 线程与进程,主线程
前言经常JVM进程启动过程中就自动退出,但是有时候却不会,笔者也没有深究原理,直到最近处理问题,发现不知道为什么进程退出。原来JVM早就定义了规范。这对我们开发中间件会提供一种设计规范。1. 进程退出1.1 线程执行结束进程退出demo如下:public class ThreadDaemon { public static void main(String[] args) { System.out.println("main thread start...");原创 2021-11-22 21:42:05 · 995 阅读 · 0 评论 -
arthas 启动原理分析
前言经常在应用的启动或者运行过程中需要动态的查看数据,或者实时的验证我们写的代码的结构与执行过程,此时需要一种工具能够动态的检测程序运行的状态,内存数据,线程情况,最好能够动态的替换代码实时生效,方便我们从日志或者其他埋点断言我们的猜测。1. arthas 阿尔萨斯的工程结构其实有很多工具可以达到这种效果,arthas就是其中一种。从工程结构,其实arthas的核心功能是core,里面有arthas的attach与诊断指令的代码。 通过实际启动分析进一步看原理。2. art.原创 2021-08-16 21:48:41 · 2465 阅读 · 0 评论 -
JVM远程调试功能开启,与原理
前言以前有篇文章,讲解Tomcat开启远程调试功能,只是讲解了用法,以及Tomcat的作者书写脚本的初衷。原理没写,其实不是Tomcat的具有远程调试功能,是JVM虚拟机提供的能力。原创 2020-12-28 21:37:20 · 2081 阅读 · 1 评论 -
Integer的parseInt与value of的原理
前言笔者一直使用Integer的转换,包括Long,枚举等,从来没有注意它是怎么实现的,最近有个业务组转换报错了,想看看是如何实现的。据笔者猜测:ASCII码转换?这是常用的计量,什么大写变小写都是这样实现的。下面看看如何实现的吧1. demo构建public class StringParseInt { public static void main(String[] args) { String str = "-1234"; int i = Inte原创 2020-09-28 22:22:15 · 818 阅读 · 2 评论 -
comparator和comparable的使用
comparator和comparable前言comparablecomparable democomparable源码分析comparatorcomparator demoComparator源码分析总结前言最近笔者被问到对象排序的时候,要求是传入不同的规则,排序不一样,类似一个按不同的条件排序的功能,笔者想到了comparator,其实comparable也是可以的,只是不太符合这个功能而已,通过comparator的切换即可实现。comparablecomparable democompar原创 2020-07-07 22:05:53 · 515 阅读 · 0 评论 -
Java 单元测试(3)mock进阶 - 静态、final、私有方法mock
mock进阶前言1. powerMock1.1. powerMock官方文档1.2. powerMock demo模拟2. JMockito前言上一章讲了Spring-boot的starter test使用mock的方式mockito。但是mockito由于实现方式的原因(动态代理)不能支持静态、final、私有方法的mock。其实还有一种叫native方法,只是一般自己写native方法的地方不多,可能Android系统在这方面使用较多,比如游戏。查询了一些资料与笔者的以往经历,主要使用的有power原创 2020-05-27 22:49:43 · 15791 阅读 · 5 评论 -
Java 单元测试(2)mock
单元测试mock前言1. mock1.1 什么情况需要mock1.2 mock的分类1.3 有哪些mock2. mockito2.1 mock引入2.2 demo模拟2.3 mock2.4 InjectMocks2.5 spy2.6 打桩2.6.1 方法打桩2.6.2 异常打桩2.6.3 参数、返回值打桩verify灵魂powermock前言上一章讲解了 Java单元测试 标准模式。但实际情况是,往往我们工作中很多时候需要依赖第三方服务或者中间件才能执行单元测试,这时就需要一个关键工具mock。1.原创 2020-05-16 22:26:07 · 1803 阅读 · 0 评论 -
Java 单元测试(1)合格的单元测试方式
前言 最近需要做单元测试代码覆盖率,虽然并不能反映代码的质量;但是在写单元测试的时候,发现对代码的规范上有质的提升。比如:判空处理,比如多分支处理等。单元测试其实是初级程序员的必备技能,只是很多时候忽略了。而在Java的编程中一般单元测试指Junit测试与testng测试。1. Junit 测试demoJunit测试其实已经根深蒂固,常用的版本是Junit4,最新的版本J...原创 2020-05-07 22:19:00 · 1333 阅读 · 1 评论 -
Java结束线程
前言 最近年底,项目紧很少写博客了,现在说说最近碰到的问题,笔者在做分布式JOB系统的时候,遇到一个比较棘手的问题:停止正在运行的线程。1. 线程的生命周期线程停止即Terminated状态是伴随run方法的结束而生,也就是run完成后由Thread类来决定线程停止了,销毁资源释放空间。关于线程可以看我的另一篇文章:线程的实现,调度和生命周期,纯粹理论。2. 手...原创 2019-12-02 21:41:41 · 357 阅读 · 0 评论 -
fastjson set方法的属性依赖,转对象的部分属性为空
前言 最近做项目,发现fastjson在parseObject的过程中,出现部分属性丢失,然而json字符串确是存在属性值的,然后试了gson,发现正常,但是jackson某些情况下也存在问题。下面分析1. demo<dependencies> <dependency> <groupId>com....原创 2019-11-03 21:55:52 · 2443 阅读 · 0 评论 -
ArrayList与HashMap遍历删除元素,HashMap与ArrayList的clone体修改之间影响
前言 最近做项目,需要克隆map与list,并在克隆的map或者list中进行增删改操作,发现引用对象在map或者list是浅克隆,即克隆引用或者指针。1. demoPerson类省略package com.feng.clone;import java.util.HashMap;import java.util.Map;public class MapClo...原创 2019-10-24 22:26:51 · 359 阅读 · 0 评论 -
嵌入式tomcat的不使用web.xml原理分析
前言 前面的章节讲了嵌入式tomcat使用web.xml启动,这章说说不使用web.xml启动tomcat。有了这个就明白Spring Boot是如何在没有web.xml的的情况下实现web能力的,以后的tomcat容器应用就可以实现jar运行,十分方便。1. servlet标准首先看Oracle的javaEE文档Interface ServletContainerInit...原创 2019-07-20 16:21:22 · 3760 阅读 · 3 评论 -
Java动态加载jar
前言 最近做项目,有需求需要运行过程动态加载jar,然后执行后加载别的jar,来达到实现不同的动态能力,下面实现了2种方式,各有各的优势。1. beanpackage com.feng.collections;public class Cat { private String name; private String type; publ...原创 2019-09-17 21:52:49 · 1365 阅读 · 0 评论 -
JAVA SPI实现机制与原理分析
前言 最近要做业务接口,需要在多个模块根据需要调用不同的实现,立马就想到了SPI机制,但是Java自带的SPI又不能满足要求,使用dubbo的SPI就能达到目的,但这样就需要强依赖dubbo的jar,就想自己定制一个简单的实现,首先看看java的SPI如何实现。1. demopublic interface SPInterface { void hello();...原创 2019-09-19 22:56:48 · 560 阅读 · 1 评论 -
Java SPI改造支持按需查找实例化实现类
前言 上一章分析了Java SPI机制的原理,是通过遍历查找实现类,并实例化对象。实际工作却需要按需查找并实例化对象。我自己写了一个简单的demo,仅在官方的API做少量修改即可。1. demo源码package com.feng.spi.demo.loader;import java.io.BufferedReader;import java.io.IOExcep...原创 2019-09-22 10:52:22 · 499 阅读 · 0 评论 -
JDK8线程池-ThreadPoolExecutor动态调整corePoolSize与maximumPoolSize
前言线程池ThreadPoolExecutor在运行的过程中,业务并发量变动,需要不停服务调整线程池的线程数,ThreadPoolExecutor支持动态调整corePoolSize与maximumPoolSize的值。1. 示例demopublic class ThreadChangeTest { public static void main(String[] args)...原创 2018-11-25 10:28:42 · 10766 阅读 · 7 评论 -
JDK7 新特性
1. try-with-resources最初是看OSChina,红薯发文看见的,比较好用。操作的类只要是实现了AutoCloseable接口就可以在try语句块退出的时候自动调用close方法关闭流资源。InputStream is = null;OutputStream os = null;try { // 流 is = xxx; os = xxx;...原创 2018-08-23 11:43:19 · 2947 阅读 · 0 评论