自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

sanding的博客

Technology comes from sharing.

  • 博客(247)
  • 收藏
  • 关注

原创 在Spring中我们为什么要使用构造器的方式进行依赖注入?

Spring的依赖注入的深入理解。Spring的依赖注入的最佳实践。细节化自己的知识。优化自己的知识。查漏补缺自己的知识。

2022-06-26 11:37:11 703 1

原创 我对java中使用集合设定初始容量的理解

设置java容器的初始容量可以在性能要求很高的场景是有必要的。我们需要深入理解java集合容器的扩容机制。需要深入理解当前的业务场景。

2022-06-26 11:13:04 1021 1

原创 解决idea中使用git相关命令非常慢

解决idea中使用git非常慢的问题。

2022-06-26 10:47:43 1682

原创 记录一个不理解forEach而导致的错误

forEach与return联合使用,可能存在一些不符合逻辑的错误问题。

2022-01-11 10:39:09 280

原创 记录一个批量数据进行分组的小算法

上万,上千条数据进行分组小算法。无论是客户端和服务端都可以使用这样的分组小算法逻辑过程。很有意思。

2022-01-11 10:20:33 451 2

原创 通过demo理解mybatis的plugin

背景1, mybatis通过插件来扩展功能。2,Mybatis的插件其实可以理解为拦截器。3,Mybatis能够拦截的接口只有4个(1)ParameterHandler(2)StatementHandler(3)Executor(4)ResultSetHandler过程文件目录全景接口InterfacePlugin的实现类实现InvocationHandler的Plugin测试类测试结果小结其实,理解代理的执行流程会有一些抽象。因此,记录一

2021-09-17 16:18:09 197

原创 java的spi学习与理解

背景spi在很多框架中都有使用到。a. JDBC加载不同类型的驱动。b. SLF4J对log4j/logback的支持。c. Dubbo中也用SPI的方式实现框架的扩展, 但是它对java提供的原生SPI做了封装。spi的思想就是面对接口编程。让程序达到非侵入式。过程编程的3层工作模式定接口标准(思想,模式,创新)接口的具体实现(技术实力,基础技术知识)应用(理解框架概念,工作过程,熟练应用)SPI(Service Provider Interface)理解。 例子

2021-09-14 10:22:30 163

原创 细节决定成败(二):记录日志的细节

背景阐述记录日志的重要性。如何记录日志。过程记录日志的重要性以前一直以为能够把代码写好,没有bug,且稳定就是一件最重要的事情,但是,现在我到是觉得记录日志的这件事反而比代码的实现更为重要。以前,我们的航海家就会记录航海日志,把这些过程和细节都记录下来,以便让我们或者后来的人知道发生了什么。如果实现的代码没有日志,就是一个黑盒子,我们完全不知道里面的运行过程,当前运行到哪一步了,接下来可能又会运行那部分逻辑。如果没有实现的代码没有日志,一旦线上出现问题,因为测试用例也无法完全覆盖所

2021-06-15 10:14:45 214

原创 细节决定成败(一):处理json格式的字符串要多注意细节

背景json格式的字符串,注意类型,是java类型的String还是实体类型(对象)根据接口文档写代码的时候,对有疑问的地方要提出来。过程接口文档响应报文{"rspCode":"0000","rspDesc":"操作成功","uuid":"ec6865ca-7a1d-41ad-a9f2-23b792417f1","body":{\"id\":\"17610522126516\",\"preNumber\":\"1760032825\",\"shortUrl\":\"https://uc.g

2021-05-29 15:37:20 305

原创 java的Exception方法printStackTrace()不打印日志?

背景记录java的Sytem.out与System.err区别e.printStackTrace()与Sytem.err的关系在生产环境在捕获到异常的时候调用e.printStackTrace(),然后又立即调用log.info()打印日志,可能会出现什么问题?是顺序输出日志的吗?e.printStackTrace()一定会打印日志吗?过程现象测试代码public class JsonTest { public static void main(String[] args

2021-05-29 11:30:18 6095

原创 软件开发流程(一):总结软件开发流程的经验教训

背景复习软件开发过程可能出现的问题。沉淀经验教训。过程“如果你不知道如何写代码,是因为你的需求不明”。分享一个有力的观点。这是刚入行的时候,同事告诉的。DDD过程业务研究员(产品经理)与领域专家进行沟通,在这个过程中,如果有机会,程序员也可以参与讨论,学习更多领域知识。当然,如果有机会,也可以参与模型的设计。无论是产品经理,还是程序员刚接触一个领域的时候,对领域的概念存在错误理解和理解的不够深,都是正常的。产品经理设计的模型也可能存在不合理的地方,甚至是错误的。因此,开发前发现不合

2021-05-16 10:00:59 1078

原创 java动态代理使用过程(mybatis源码用的非常多)

背景记录动态代理的使用过程理解动态代理做了一件什么事情过程接口public interface InterfacePlugin { void test(String name);}InvocationHandler的实现类public class Plugin implements InvocationHandler { private InterfacePlugin interfacePlugin = new InterfacePluginImpl();

2021-04-12 16:28:27 170

原创 Mybatis的mybatis-config.xml文件的标签是有顺序的?

背景记录添加mybaits插件报错过程错误标签顺序配置结果configuration的内容必须按照如下内容和顺序进行匹配 “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”。修改,把plugins移动到environment标签之前结果,正确

2021-04-12 10:28:58 263

原创 带着疑问去学习Mybatis的工作过程

背景记录应该理解Mybatis核心问题是哪些过程如何在项目中引入Mybatis Mybatis的groupId是什么?artifactId又是什么?目前最新版本是多少?如何从xml中构建 SqlSessionFactory?SqlSessionFactory的作用是什么?xml配置了哪些信息?用什么方式解析xml的?xml里的标签都是什么意思:configuratio、environments、transactionManager、dataSource、mappers。这些标签的属性分别是

2021-04-10 23:58:56 127 2

原创 Mybatis源码中的架构设计

背景记录Mybatis的架构设计过程架构图说明接口层,SqlSession就是我们每次请求创建的sqlSession会话实例。功能就是跟数据库进行交互。执行的动作就是CRUD操作。数据库处理层,配置信息(参数信息,sql信息,结果集返回映射信息),解析配置信息,类型转换(java type到jdbc type; jdbc type到java type)基础层。提供基础设施,比如读取文件资源的io, 构建xml的builder,解析xml的xpath、xnode,事务管理,缓

2021-04-10 23:20:49 178

原创 Mybatis源码中的功能模块分析

背景记录mybatis3的功能模块,辅助理解mybatis是怎么工作的。过程源码模块展示annotations注解,比如常用的@Select, @Insert,@Update,@Delete还有其他很多。用法就是利用反射的知识,拿到类的元信息,然后按照定义的规则,一步一步解析出来。binding(非常重要的模块) 为mapper接口生成对应的mapper代理类,并能够通过statementId获取到每个mapper文件都有一个对应的mapper代理类。MapperProxyFac

2021-04-10 18:25:43 235 3

原创 编码意识(一):在知道和真正理解并运用之间有一个过程

背景从书上看见的,从讨论中获取的,从实践中体会的,从反思中感悟的编码意识。这些经验很好,可是真正能够运用起来却真的需要一个漫长的过程。过程抽象与具体编码意识销毁一个城市。销毁一个罗马城市。在具体的实现过程中,写一个销毁城市的方法,将城市名称作为参数传递。更新一条数据。更新数据的状态为已完成。在具体的实现过程中,写一个更新数据的方法,把状态作为参数传递。结论:我的方法仅仅是“工具”,做一件事的中介,不应该和具体的业务逻辑耦合到一起。修改代码的编码意识不要去修改原来

2021-03-28 10:22:59 364

原创 Spring自带线程池(ThreadPoolTaskExecutor)用在Spring Event,理解拒绝策略

背景基础代码逻辑Spring自带线程池(ThreadPoolTaskExecutor)用在Spring Event中,过程与理解加深对线程池拒绝策略的理解注意这里仅仅是线程池的拒绝策略,没有线程池中的线程在处理过程中发生业务抛出的异常。过程线程池配置( corePoolSize=1;maxPoolSize=1;queueCapacity=1;)import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;

2020-12-27 08:49:45 1177

原创 Spring自带线程池(ThreadPoolTaskExecutor)用在Spring Event,在执行过程中,发生异常事务会回滚吗

背景推荐阅读Spring的event的基本使用过程与理解测试当线程池中的任务发生异常(RuntimeException)不捕获与@Transactional关系过程测试事务(入口处没有注解@Transactional)测试逻辑。业务逻辑代码先执行了数据库的更新操作,后续逻辑发生空指针异常。数据库情况代码情况监听代码情况 @EventListener @Async("AsyncTaskExecutor") public void handleMyEvent(My

2020-12-26 23:25:13 1630

原创 Spring自带线程池(ThreadPoolTaskExecutor)用在Spring Event中,过程与理解

背景掌握Spring Event的使用过程过程代码逻辑过程EventMyEventimport lombok.Data;import org.springframework.context.ApplicationEvent;import java.util.Date;@Datapublic class MyEvent extends ApplicationEvent { private String addr; private String operato

2020-12-26 17:04:08 907

原创 jvm的jstack定位线程状态问题

背景如果存在线程之间相互等待,造成大量线程处于blocked状态,应该如何定位问题?过程测试代码public class JVM_Thread_Problem01 { private static Object obj = new Object(); public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() {

2020-12-18 19:27:03 1296

原创 jvm的相关命令行指令和问题分析集锦

背景整理并记录jvm常用指令整理常见问题及分析过程过程jvm常用指令java -X 查询有哪些非标准参数java -XX:+PrintCommandLineFlags -version 查询使用了哪个垃圾收集器和java版本号jps 查询有哪些java进程jinfo pid 查询关于此java进程的一些基础信息jstat -gc pid 查询关于此进程的垃圾收集情况jstack pid 查询关于此进程的线程情况jmap -heap pid 查询关于此进程的堆情况。(堆信息

2020-12-18 08:43:37 276

原创 jvm的调优过程分析与理解

背景在什么样的情况下,需要调优?调优的基础指令?调优实战过程的注意事项?过程需要调优预调优。在具体的业务场景下。比如客户预算只有那么点钱,买个云服务器部署项目。慢,卡顿。在具体的业务场景下。比如项目已经在生产环境跑起来了,出现了,慢或者卡顿现象。OOM。在具体的业务场景下。比如项目已经在生产环境跑起来了,出现了,OOM情况。调优的基础指令java -X (查询非标准选项) -Xmixed 混合模式执行 (默认) -Xint

2020-12-17 20:09:54 405

原创 jvm的垃圾回收核心概念总结

背景什么是垃圾?如何定位垃圾?有哪些垃圾回收算法?垃圾回收器及其工作过程?过程垃圾Student对象,持有一个Computer对象的引用。如果在程序中执行了这样的一条语句,computer = null, 变成如下情况如果一个对象不再被使用了,也就是对象没有被引用了,就成垃圾了。定位垃圾引用计数算法,当一个对象被引用一次,此对象被引用的次数就加一。当对象不在被引用的时候,就会被认定为垃圾。但是,存在循环引用问题,导致全是垃圾,都是又存在引用记录数。根可达算法,从根对象(虚拟机栈

2020-12-16 11:39:09 182

原创 compareAndSet(CAS, 自旋锁)理解

背景CAS?自旋是什么意思?CAS是怎么保证原子性操作的?CAS带来的ABA问题,及解决方案?过程CAS compareAndSet,compareAndExchange,compareAndSwap这个函数会先进行比较,如果相比较的两个值是相等的,那么就进行更新操作。CAS使用场景AtomicInteger atomicInteger = new AtomicInteger(1);atomicInteger.compareAndSet(1, 2);初始值是1compar

2020-12-13 17:06:27 25028 5

原创 java无锁,偏向锁,轻量级锁,重量级锁

背景纤程(协程),线程锁状态概念理解锁升级过程理解过程纤程(协程),线程纤程和协程表示同一个概念。是处于用户态的线程且与内核态的线程数的比例是m:n。在用户态切换线程的时候,不需要操作系统的辅助。一般m是远大于n的。线程,可以理解为用户态的线程与内核态数量是1:1的对应关系。当用户态的线程进行切换的时候,需要操作系统进行辅助。对象头基础知识对象头中的markwork标识着对象的锁状态信息。mark word 包含的内容 : 对象哈希码,对象分代年龄,指向锁记录的指针,指向重量级锁记

2020-12-13 16:00:20 321

原创 踩坑后整理一些思考和做法(总结一)

背景在实践过程中,总有一些做法和思路是不太好的。究竟怎样的思考和做法,才会合乎标准或者说达到自我满意的感觉?过程修改代码?需求变更,是需求本身变化,还是在已有的基础上扩展需求?有些需求,不需要修改代码,有些需求,是需要修改代码的。不是不修改,而是修改少量代码,下策。需求来了,应该是扩展代码,添加起来非常容易,上策。有的时候通过配置化达到扩展也是非常有必要的。因为想要完全做到,对修改关闭,对扩展打开,是不可能的。因此依据在实践中学到的经验,做出一个非常合理的决定,也是非常好的。对接外部系统的思

2020-10-25 15:46:51 286

原创 在实践中常用的两种分割集合中元素的方法

背景有些时候,需要把集合中的元素,用逗号进行分割。记录两种常用的处理方式。过程经典分割写法 public static String convertToDelimitedString(List<String> list) { StringBuilder resultString = new StringBuilder(); if (list != null) { for (String result : list) {

2020-09-22 09:07:32 755

原创 写java代码的通用套路和技巧

背景记录写代码的通用套路。过程代码过程演示controller层统一响应码标准。 比如成功的响应码是 0统一返回类, Result统一业务异常类, BizException统一断言类, Asserterservice层业务逻辑的抽象层分离。这个就非常有难度。根据参数去数据库查询,对查询结果进行非空判断。 一旦去数据库查询,则一定要对查询的结果进行判断。如果为空,且业务逻辑是需要有数据的,则抛出异常。判断字符串为空的时候,使用StringUtil即可。判断集合为空的

2020-09-04 18:42:15 586

原创 git实践过程中的总结记录

背景在实践过程中,发现git常被用于如下三个场景中,总结并记录下来。过程远程已经有某个分支了,本地也需要一个分支与之对应上假如远程已经有了一个dev分支,如何在本地得到一个名称是dev的分支?git checkout –b dev origin/dev如何让本地的dev分支和远程的origin/dev分支关联上来?git branch --set-upstream-to=origin/dev远程没有某个分支,需要重新创建一个分支本地创建一个分支,并切换到新创建的

2020-08-29 17:19:22 262

原创 在编码过程中,对需求的深刻理解

背景刚入行的时候,更多考虑的是:需求是否有难度,是否能够在规定的时间内完成,而在设计层面是缺乏思考的。在知识和经验不足的情况下,是不知道该怎么办的。也不知道一件事情的标准做法是什么。做了三到四年的时候,发现原来的思路其实是错误的,需要转变过来。需要培养一个意识,那就是如何对需求进行设计上的考量。做到5年的时候,就会效率高,质量好。过程写的不是代码,而是自己与别人沟通后的理解。如果能够很好的理解别人需求,那么代码写出来的质量就特别高。多问:需求的使用场景?需求的意义?需求不明确,整体脉

2020-08-29 16:28:32 1007

原创 Activiti7.0进阶学习(八):Activiti抛出了PersistenceException

背景记录activiti为什么会抛出PersistenceException过程操作过程activiti的审批流程中的某个节点是或签节点。两个审批人同时进行同意操作(complete)这个异常是必出现的。错误信息2020-08-05 15:20:27.904 ERROR [http-nio-9011-exec-9] o.activiti.engine.impl.interceptor.CommandContext - Error while closing command c

2020-08-07 19:28:55 980 8

原创 Activiti7.0进阶学习(七):Activiti抛出了OptimisticLockingException

背景记录在使用activiti过程中,抛出了异常OptimisticLockingException过程操作过程activiti的流程定义节点是一个会签节点,此节点审批人有多个。当两个审批人同时进行complete操作的时候,会抛出并发错误。这是一个必现的问题。只要同一个节点的两个审批人,同时点击同意(complete)操作就会发生。产生结果如下分析这是并发操作导致的问题。因此需要加锁。主要是activiti在设计的时候,就确定了,同一个审批实例下同时只能有一个线程处理任务

2020-08-07 19:14:22 4042 1

原创 Activiti7.0进阶学习(六):Activiti的乐观锁实现过程

背景学习activiti的乐观锁实现过程,可以先理解complete工作过程在多个线程同时操作同一个taskId的时候,activiti是怎么解决并发问题的?过程activiti使用乐观锁(Optimistic Locking)做的并发控制一旦并发冲突(多个线程同时操作同一个taskId的时候)发生的时候,一个异常OptimisticLockingException就会被抛出来,同时事务也将回滚。检测到冲突发生的时候,其实是多个线程同时对同一个数据进行写操作。activiti的默认表

2020-08-07 18:58:11 2568 3

原创 Activiti7.0进阶学习(五):Activiti在执行complete操作时发生了什么?

背景在activiti中,每个节点(user task)都可以理解为activity。 那这个activity是怎么执行的?也可以理解为程序代码在执行complete时,发生了什么?什么又是 Asynchronous Continuations?为什么需要Asynchronous Continuations?过程complete流程进入到activity时,"TAKE"监听器就会被调用。activity自己调用"START"监听器。activity的行为将会被执行。当activ

2020-08-07 18:21:49 7321

原创 对乐观锁和悲观锁的理解

背景凡是出现并发问题,第一个想到的就是锁。什么是乐观锁?使用的场景是什么?什么是悲观锁?使用的场景是什么?过程乐观锁 - 整个过程是没有上锁的系统是一定需要支持事务的。在这样的条件下,对并发控制来说,使用乐观锁(乐观并发控制)。在读多写少的场景中,乐观锁是非常有效率的。多个线程可以同时读同样的数据。在这整个过程,会持续检测冲突,并防止多个线程尝试修改这同样的数据。整个过程中,只有一个线程会更新成功,其他会更新失败。更新失败的,会进行事务回滚,并且抛出异常。不上锁,性能高。乐观锁理解

2020-08-07 13:45:51 491

原创 synchronized理解

背景理解并记忆实例对象布局理解并记忆对象头布局对象的状态过程实例对象布局对象头(mark word, class pointer)实例数据对齐填充(保证是8个字节的整数倍,方便机器加载或者读取字节到内存或者寄存器)对象头布局mark word : 对象哈希码,对象分代年龄,指向锁记录的指针,指向重量级锁记录的指针,GC标记,偏向线程ID,偏向时间戳klass pointer: 类型指针。 对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实

2020-08-02 19:08:22 240

原创 Mysql在乐观锁层面解决并发问题

背景假如一条数据同时只能被一个线程修改。这个时候应该怎么解决呢?过程数据库中的数据 这里把status理解为version即可mybatis做更新的时候,返回受影响的行数。默认是返回匹配的行数,匹配的行数不代表被更新了。没有被更新,则不是受影响的行数。连接url上添加如下参数:useAffectedRows=true,表示update的时候,返回受到影响的行数。测试方法1在if判断处,打上断点。测试方法2测试过程:先debug执行test1,然后直接执行完test

2020-08-01 17:14:53 700 2

原创 Mysql的select for update理解

背景一条数据不能同时被两个或者多个线程修改。保证数据的有效性。比如下订单后,扣库存数量就需要这样的保证。过程数据库中数据测试方法1:testForUpdate1分析:代码在if判断处,打上断点。测试方式2:testForUpdate2测试过程描述先跑测试方法1,一直卡在断点处。这个时候直接执行测试方法2。测试结果测试结果分析由于测试方法1先把id为27的数据上锁。测试方法2能够读到数据,但是不能修改id为27的数据。小结记录对一个小知识的理解过程

2020-08-01 16:26:15 3114

原创 加深Java对象的底层知识理解

背景对象的创建过程?DCL与volatile问题?对象在内存中的存储布局?对象头具体包括什么?对象怎么定位?对象怎么分配?Object o = new Object(),在内存中占用多少字节?过程对象的创建过程小结...

2020-08-01 10:05:54 156

空空如也

空空如也

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

TA关注的人

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