- 博客(55)
- 收藏
- 关注

原创 Spring Boot的自动装配中的@ConditionalOnBean条件装配注解在Spring启动过程中,是如何保证处理顺序靠后的
Spring Boot的自动装配中的@ConditionalOnBean条件装配注解在Spring启动过程中,是如何保证处理顺序靠后的@ConditionalOnBean条件装配的顺序就是Spring的DeferredImportSelector接口延迟处理机制来保证的。
2023-09-30 13:27:38
3408

原创 Mockito源码浅析——核心逻辑
一、Mockito源码逻辑简介 Mockito是一个Mock框架,让你用简单干净的API写漂亮的测试代码。Mockito通过ByteBuddy动态字节码生成技术生成mock类型(你要模拟类的代理类),默认通过objenesis框架生成mock类型的对象实例,mock实例对象的所有方法都会调用MockHandlerImpl对象实例的handle方法。 该文章主要从三个部分进行讲解:mock代理对象创建,mock对象方法的打桩,mock对象方法的入参验证。二、mock代理...
2021-10-11 21:37:00
1300
原创 @TransactionEventListener的关键源码整理
根据Class对象找到每个方法,挑选出被@EventListener注解标记的方法,然后交由对应的org.springframework.context.event.EventListenerFactory来创建监听器适配器,并将监听器适配器添加到容器的监听器集合中(当然这里不变一定是监听器适配器,创建并添加监听器也行,只不过目前现状都是采用的适配器,如果自己实现监听器,在监听器直接处理也行,只不过由适配器处理更加的灵活,有点类似于代理、委托的感觉)。事务同步器适配器做了空实现。
2025-01-21 16:44:36
514
原创 为什么快慢指针可以找到有环链表的入环节点
为什么会是这个样子呢?快指针追上慢指针,这个说明什么?这说明快指针比慢指针多走了N圈。因为如果快慢指针相遇,那说明当前快慢指针都在环上的同一个节点,而慢指针所走的路径和步数,快指针一定早就走过了,抛去快慢指针入环前的重合路径,剩下的快指针比慢指针多走的步数,都是属于环上的,而此时还都在同一个节点,相当于快慢指针都以入环节点为起始节点,一直转圈,最终相遇了,那么就是多走了N圈么)。快指针走2步,慢指针走1步,相遇以后,快指针回到起点,然后快慢指针都走一步,当再次相遇,就是第一个入环节点。
2024-12-07 22:00:26
254
原创 补码是如何定义出来的(或者说补码是如何产生的)
我们拿最简单的负数运算来举例,我们来看 -1+1=0这个运算,用4位的二进制数来表示,负数位置由于我们不知道应该如何表示,那就暂时这么表示:-1+0001=0000,我们很自然的就可以想到,这里面的0000是可以通过位的溢出来实现,因此0000可以用10000来表示,那么这个-1就应该是1111,这样才能保证-1+1=0(这个0其实相当于10000,只不过高位1溢出了)。PS:用4位二进制数举例子是因为8位太长了,道理都是相同的,位数太长没啥必要,还挺费眼睛的。
2024-10-04 00:33:17
1992
10
原创 String类型的JVM层面原理总结(字符串常量池-StringTable、运行时常量池、intern、JVM的ldc)
String类型的JVM层面原理总结(字符串常量池-StringTable、运行时常量池、intern、JVM的ldc)
2023-01-08 11:48:09
220
原创 Java注解简介
Java注解是一种标注。Java中的类、方法、变量、参数、包等均可以被注解标注从而添加额外的信息。相比于直接修改代码的硬编码方式,基于注解的这种松耦合的信息添加方式更受欢迎。1.元注解随便打开一个注解类,会发现它们中也包含注解。这些用来注解其他注解的注解,称为元注解。元注解一共有五个,分别是@Target、@Retention、@Documented、@Inherited、@Repeatable,下面分别进行介绍。@Target 注解用来声明注解可以用在什么地方,它的值需要从枚举类Element
2022-03-29 12:48:05
651
原创 序列化与反序列化
序列化是把对象转换为字节序列的过程;反序列化是把字节序列恢复为对象的过程。对象的序列化主要有两个目的:一是将对象转化成字节后保存在存储介质中,即为了持久化对象;二是将对象转化成字节后在网络上传输,即为了传输对象。而与之对应,将字节还原为对象的过程就是反序列化。在 Java中,要表明一个类的对象是可序列化的,则必须继承 Serializable接口或其子接口 Externalizable接口。Externalizable接口的使用稍复杂,将在 22.1.3节中介绍,这一节先介绍 Serializable接
2022-03-22 12:51:28
112
原创 Java的异常介绍
“异常”代表程序运行中遇到了意料之外的事情,为了表征异常,Java标准库中内建了一些通用的异常,这些类以 Throwable为父类。而 Throwable又派生出 Error类和 Exception类两大子类。· Error及其子类,代表了 JVM自身的异常。这一类异常发生时,无法通过程序来修正。最可靠的方式就是尽快停止 JVM的运行。· Exception 及其子类,代表程序运行中发生了意料之外的事情。这些意外的事情可以被 Java异常处理机制处理。而 Exception类及其子类又可以划分为两大
2022-03-22 12:41:45
697
原创 记 2022-03-03 线上系统响应缓慢 频繁FullGC问题
事件时间及地点2022年03月03日 周四 北京 京东总部4号楼事件现象描述线上系统 某一台机器 的许多接口 发生报警,提示响应时间较长,也就是系统响应慢; 线上一共12台机器,并不是固定的一台服务器报警; 每隔2个小时左右就会发生一次此现象; 查看对应机器的线上监控,发现CPU很高,并且发生了频繁的FullGC;问题排查过程用web页面操作服务器,发生问题的机器生成heap dump堆转储文件; 将文件下载到本地以后用java的jdk下的bin目录中的jvisualvm打开堆转储
2022-03-07 20:14:04
335
原创 单元测试Mockito框架——基本用法总结和示例
前言至于什么是单元测试Mockito框架以及它的作用就不在这里赘述了,百度一下会有很多介绍;这里主要是写一些干货,是在日常编写单元测试会用到的内容总结。总结和示例示例主要采用一个完整的TEST类来演示,注解版本和非注解版本都会写;至于具体的细节解释则会在代码示例中以注解的形式给出。半个月内写完这篇文章。...
2021-09-13 09:54:20
148
原创 EasyExcel的导入和导出
导入:下面是从http请求流中读取数据流,其他形式的数据流道理相同;逻辑代码: @PostMapping(value = "import", consumes = "multipart/*", headers = "content-type=multipart/form-data") public String import(MultipartHttpServletRequest request) { log.info("import批量录入数据开始");
2021-07-22 20:35:53
685
原创 Mockito关于抽象类的问题
真实调用抽象类需要中的方法需要真实调用,那么用@InjectMocks是不管用的,需要如下代码: DefaultCreateOrderTemplate defaultCreateOrderTemplate; @Before public void setUp() { defaultCreateOrderTemplate = mock(DefaultCreateOrderTemplate.class, Answers.CALLS_REAL_METHODS);
2021-05-20 16:22:52
4423
3
原创 ES常用指令
#显示各个分片的状态GET /_cat/shards?v#显示集群健康值GET /_cluster/health#新建索引PUT /test_index?pretty#查询所有索引GET /_cat/indices?v#删除索引DELETE /test_index?pretty#排序GET /product/_search?sort=price:desc#关键词查询+排序GET /product/_search?q=name:phone&sort=price:desc#查
2021-04-01 00:06:54
241
原创 2020-11-18记录FullGC排查过程
系统突然发生宕机,由于前期已经发现系统卡顿现象,因此将GC日志打开了,登录服务器查看日志,top指令发现CPU占用100,java进程内存占用4.7G,疯狂打印FullGC日志; top -Hp pid查看,发现是垃圾回收的线程占用的,当然这过程需要十进制向十六进制转换pid,同时jstack查看线程信息; jmap导出dump文件,由于文件较大,且当前服务器下载速率较低,因此使用scp复制到190服务器,然后用winSCP下载到本地; 接着使用jvisualVM打开堆dump文件; 发现char[
2020-11-18 22:07:03
211
原创 java线程的六种状态以及转换
1.双向箭头:状态可以互相转换;单向箭头:状态只能单向转换;2.NEW:创建java线程初始对象,线程还未运行起来,调用start方法会变成RUNNABLE状态;3.RUNNABLE:运行中,可运行,阻塞(操作系统);...
2020-10-10 00:13:37
208
原创 字母和数字交替输出,并保证字母永远排在前面
import java.util.concurrent.CountDownLatch;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockTest { static ReentrantLock lock = new ReentrantLock(); static Condition cond1 = lock.ne.
2020-10-10 00:00:50
326
原创 java对象的创建过程--编码演示
源码class T { int m = 8;}T t = new T();汇编码0 new #2 <T> //在堆中为对象开辟空间,并且为属性附零值(0或null),m=03 dup 4 invokespecial #3 <T.<init>> //调用构造函数,并对属性赋值,此例是m=87 astore_1 //将创建好的对象地址,赋值给变量t8 return...
2020-09-26 21:05:43
92
原创 Oracle创建表空间及用户--亲测有效
创建表空间create tablespace FLAS_LOG--表空间名称datafile '/oracle/oradata/flas_log/flas_log.dbf'--表空间的文件地址size 1M autoextend on next 50M maxsize unlimited;--autoextend on:自增;next 50M:自增的大小;maxsize unlimited:不限制最大空间创建用户create user FLAS_LOG--用户名identified by
2020-09-08 00:02:56
119
原创 struts2中获取request文件流
public class InterfaceServiceImplAction extends BaseFormBean{private Map<String,Object> dataMap;private File file;private String fileFileName;private String appId;private DocBizManageBo docBizManageBo;private DocManageBo docManageBo;p...
2020-09-03 00:42:42
742
原创 融资租赁资产管理系统(FLAS)项目运维经验记录总结--org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
问题:xml解析抛异常,异常信息如下:javax.servlet.ServletException: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not foundat org.apache.jasper.servlet.JspServlet.service(JspServlet.java:268)at javax.servlet.
2020-08-23 02:42:00
792
原创 Maven下载、配置及idea配置
下载地址:http://maven.apache.org/download.cgi选择这个下载:Binary zip archive下载后解压,然后建立仓库目录repository,然后修改配置文件;配置文件所在路径:F:\apache-maven-3.6.3\conf配置文件主要内容:配置本地仓库:<localRepository>F:\apache-maven-3.6.3\repository</localRepository>配置阿里仓库镜像:&
2020-08-14 00:55:49
119
原创 java的多态成员访问特点
成员变量:编译看左边,运行看左边 静态变量:编译看左边,运行看左边成员方法:编译看左边,运行看右边 静态方法:编译看左边,运行看左边
2020-06-01 07:50:48
167
原创 eclipse启动tomcat堆内存溢出问题解决
-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
2020-04-21 00:08:34
305
原创 Select级联
$("select[name='payeeBankName']").change(function(){nameAndAcount();});//添加 值改变 的监听function nameAndAcount(){//联动逻辑 函数 //收款行 var bank = $("select[name='payeeBankName']").val(); //账号 var appe...
2020-02-27 19:18:27
168
原创 form表单形式导出Excel
<a href="javascript:void(0)" onclick="exportExcel()">导出1</a>// 导出,使用这种方式 可以,//使用 ajax请求不可以导出excel,因为导出excel,实际上是文件下载,后台需要往前端(浏览器)写文件流的。而Ajax请求获取数据都是“字符串”,整个交互传输用的都是字符串数据,它没法解析后台返回的文件流...
2020-02-27 13:02:50
1651
原创 Oracle和MySQL 表结构和数据 与 用户和数据库名称之间的关系
Oracle:一个库可以有多个用户,每个用户有自己的表;MySql:多个用户共享每个库,每个库有自己的表;通俗来说就是,Oracle的表结构和数据 是与用户对应的,而MySQL的表结构和数据 是与数据库名称对应的;...
2020-02-23 12:03:21
886
原创 Struts2实现原理
1.获取请求路径;(具体的action)2.到src下面找struts.xml,使用dom4j解析得到xml文件中内容,用请求路径中具体的action值匹配xml中action标签下name属性的值是否一致;3.匹配name属性值,找到所在的action标签中的另一个属性class的值,得到的是action全路径,使用反射实现功能;(反射代码:Class clazz = Class...
2020-01-31 20:14:19
109
原创 servlet生命周期
Servlet的生命周期是由servlet的容器来控制的。分为3个阶段:初始化阶段、运行阶段、销毁阶段。初始化阶段:初始化阶段步骤:ØServlet容器加载servlet类,把它的. Class文件中的数据读到内存中。ØServlet容器创建servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。此外servlet容器还会使得servle...
2019-11-10 22:01:27
91
转载 request.getRemoteAddr()和request.getRemoteHost()
System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr());System.out.println("request.getRemoteHost(): " + request.getRemoteHost());得到的结果相同(局域网内试验的结果...
2019-09-30 21:56:48
1142
原创 mysql保留字
mysql保留字如下表:ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE CASE CHANGE CHAR CHARACTER CHEC...
2019-09-29 22:13:08
883
1
原创 异常打印e.toString()、e.getMessage()、e.printStackTrace()区别
e.toString(): 获得异常种类和错误信息 java.lang.ArithmeticException: / by zeroe.getMessage():获得错误信息 / by zeroe.printStackTrace():在控制台打印出异常种类,错误信息和出错位置等...
2019-09-28 22:34:19
389
原创 ResultSet的absolute()方法
java.sql.ResultSet接口boolean absolute(int row)throws SQLException将指针移动到此 ResultSet 对象的给定行编号。如果行编号为正,则将指针移动到相对于结果集开头的给定行编号。第一行为行 1,第二行为行 2,依此类推。如果给定行编号为负,则将指针移动到相对于结果集末尾的绝对行位置。例如,调用方法 absolute(-1) ...
2019-09-27 22:36:12
1816
原创 IO流为什么必须手动关闭,不能像其他的方法坐等GC处理。
读一个文件,忘记关闭了流,你在操作系统里对这个文件的写,删除等操作就会报错,告诉你这个文件被某个进程占用,这是为什么呢? java是从c++设计来的,但是无论是C语言还是C++,都需要手动释放内存,java不需要。 因为java在对象的引用被消除之后,正常情况下,内存资源是会被垃圾回收。 使用完IO流,必须手动回收,这是为了回收系统资源。 一般来说,需要自己close的东西...
2019-09-25 22:40:26
2367
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人