自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CoderLi

微信搜一搜:CoderLi

  • 博客(106)
  • 问答 (2)
  • 收藏
  • 关注

原创 指令重排相关

指令流水线所带来的一些问题结构冒险流水线中出现硬件资源竞争数据冒险流水线中后面的指令需要等待前面指令完成数据的读写控制冒险流水线需要个怒前面指令的执行结果来决定下一步去哪儿之行为了解决指令流水线的数据冒险所带来的停顿、CPU 搞了个乱序执行。在遇到数据冒险时、指令调度单元从中选择一些没有数据依赖的指令来执行。后面再进行结果回写时、才按原有顺序进行回写。这就是 CPU 带来的乱序执行。Java 编译器处于 “优化” 的目的、按照某种规则将指令重新排序(尽管有时候看起来像乱序)

2023-08-06 22:23:38 225

原创 计算机存储设备

内存使用 DRAM 来存储数据的、也就是动态随机存储器。内部使用 MOS 和一个电容来存储。需要不停地给它刷新、保持它的状态、要是不刷新、数据就丢掉了、所以叫动态 、DRAM缓存使用 SRAM 来存储数据、使用多个晶体管(比如6个)就是为了存储1比特。

2023-07-15 11:34:55 277

原创 计算机的大脑 CPU

计算机底层原理

2023-07-09 10:23:19 198

原创 GC 日志

当使用本地方法 JNI 函数访问 JVM 中的字符串或数组数据,为保证数据安全性和准确性,获取数据(GetStringCritical)和释放数据(ReleaseStringCritical)这段过程必须在 “critical region”(临界区)执行 如果在执行临界区这段时间发生了 GC,JVM 会阻断 GC 的发生,也会阻断其他线程进入临界区,同时调 ReleaseStringCritical。当最后一个临界区的线程退出后,JVM 再进行一个 GC,即 GCLocker Initiated GC。

2023-04-06 22:13:58 451 1

原创 Java-随机数

SecureRandom 阻塞导致生产故障

2023-02-05 16:17:12 1340

原创 Spring Boot Logback启动流程

Spring Boot 默认使用的是 Logback 的日志框架、Logback 的组件主要通过 Spring Boot ApplicationListener 启动的// LoggingApplicationListener@Overridepublic void onApplicationEvent(ApplicationEvent event) { if (event instanceof ApplicationStartingEvent) { onApplicationSt.

2022-12-01 15:23:42 754

原创 package-info.java

package-info.java 文件估计大家见过但是自己却很少去创建和使用它、因为对于一般应用来说可能真的太少见了。它的作用主要是三个描述包使用注解修饰包、达到修饰该包下的类声明包中使用的类和常量(这个比较少用)描述包package-info.java 文件/** * 我是描述信息 */package com.demo.test.info;生成 JavaDoc 可以看到包的注释在说明列中使用注解修饰包假如某个包下、我们希望所有的返回值都应该非 Null、并且当我们编码的

2022-12-01 15:22:55 609

原创 Mysql replace into

CREATE TABLE `t` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `age` int(11) DEFAULT NULL,  `msg` varchar(10) DEFAULT NULL,  PRIMARY KEY (`id`),&

2022-11-28 22:34:30 570

原创 Mysql DateTime 问题

 /** * The maximum supported {@code LocalTime}, '23:59:59.999999999'. * This is the time just before midnight at the end of the day. */ 

2022-11-27 08:23:30 822

原创 Logback 相关组件

启动流程Logger logger = LoggerFactory.getLogger(Main1.class);然后回去找 ILoggerFactory 接口ILoggerFactory iLoggerFactory = getILoggerFactory();获取 SLF4JServiceProvider return getProvider().getLoggerFactory();如果 slf4j 没有进行初始化、也就是没有绑定到底使用哪个日志框架

2022-10-30 20:48:50 322

原创 Logback 的顶级接口

ILoggerFactory介绍一下 slf4j 的一些顶级接口public interface ILoggerFactory {    public Logger getLogger(String name);}再看看 logback 对这个接口的实现 ch.qos.logback.classic.LoggerContextfinal Logger root;private&nb

2022-10-29 12:04:07 817

原创 再看 Logback 源码

三大组件Logback 构建在三个主要的类上:Logger,Appender 和 Layouts。这三个不同类型的组件一起作用能够让开发者根据消息的类型以及日志的级别来打印日志。Logger 类作为 logback-classic 模块的一部分。Appender 与 Layouts 接口作为 logback-core 的一部分。作为一个通用的模块,logback-core 没有 logger 的概念。Appender 与 Layout有选择的启用或者禁用日志的输出只是 logger 的一部分功能。l

2022-10-24 21:51:58 336

原创 火焰图解释

on-cpu 花费在 CPU 上的时间off-cpu 花费在等待 I/O、锁等的时间on-cpu 火焰图采样原理对系统中运行的代码堆栈做多次的统计。每次统计的时候、找到这个时刻还在执行的堆栈锦雄计数、类似有一个监视器、每隔一段时间、就来看下系统中的堆栈、如果看到了就对堆栈计数加一。这样一直在 CPU 上运行的堆栈占比就会很大、通过这样的方式来计算、而不是计算这个方法执行了多久。Off-cpu 火焰图采样原理监听失去 CPU 和获取 CPU 的两个事件、通过这两个事件的差值计算出 off-cpu 的

2022-10-21 23:27:04 149

原创 Java getResource

最近在工作中有用到资源加载、发现 和 都可以加载 下的文件对比一下他们之间的异同通过日志分析我们得知 如果传入的参数以 开头的话则获取到的是当前 的绝对路径。如果不是的话、则是获取到当前 所在的路径 则默认获取到的就是 下的路径、如果传入的参数以 开头则返回 双亲委派机制、先给父类加载器中尝试加载、然后再到自己的。最终还是调用 这个关键在于对 的解释如果是以 开头、则直接去掉 然后返回如果不是则获取当前 的全路径、然后替换 然后返回...

2022-07-02 09:10:41 225

原创 关于 Git rebase 简谈

关于 rebase 、最常用的可能是使用 idea pull 代码的时候勾选的选项吧对于本地分支 pull 对应远程分支实际上是建议使用 rebase 的、因为这些变更只在本地、并不会产生任何坏的影响。这样子对于分支来说、会相对比较好看、并且对于公共开发、使用的是同一个分支、这样子就不会产生额外的分叉、当然要整个团队成员都是 rebase 、当 pull 远程分支到本地的时候。至于远程分支之间的合并、那就是另说了。至于压缩本地 commit 这个功能相对来说还是用得比较少。...

2022-06-30 22:47:40 285

原创 Spring Converter 体系

最近封装 RPC 相关的模块,领导说数据转换可以考虑使用 Spring 原有的 Converter 体系。Converter<S, T> 最简单的转换器、相关的顶层接口有 ConditionalConverter、GenericConverter、ConverterFactory、ConvertingComparator、ConverterRegistryConversionService Spring 数据转换的入口、它根据相关参数将调用路由到具体的 Converter。 相关的接口和类

2022-05-17 12:00:00 278

原创 静态方法杂谈

何时使用静态方法一个 stackoverflow 上面的问题、一个高赞的回答也是比较认可的答案调用此方法是否有意义,即使尚未构造任何对象假设 Car 类中有如下方法public class Car { double convertMpgToKpl(double mpg){ ........ }}那么这个方法将是静态的、因为将 Mpg 转换为 Kpl 我们不需要创建 Carvoid setMileage(double mpg)但是该方法不能是静态的、因为该方法的功能是为

2022-05-16 12:00:00 73

原创 Logback 配置

logback 的配置logback 会在类路径下寻找名为 logback-test.xml 的文件。如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。如果没有找到,logback 会继续寻找名为 logback.xml 的文件。如果没有找到,将会通过 JDK 提供的 ServiceLoader 工具在类路径下寻找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了 Co.

2022-05-15 11:30:00 2375

原创 Java Type

Type 体系Class这个我们是最常见的。我们经常会问某个对象/变量是什么类型、我们经常回答都是对应一个具体的 Classpublic class ClassMain { private Integer age; private String name; private List<String> alias; public static void main(String[] args) { ClassMain classMain = ne

2022-05-15 10:04:09 122

原创 Logback 架构与输出流程

Logback 主要由三个 jar 一起组成slf4j-apilogback-corelogback-classic<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3<.

2022-05-14 12:00:00 295

原创 package-info.java

package-info.java 文件估计大家见过但是自己却很少去创建和使用它、因为对于一般应用来说可能真的太少见了。它的作用主要是三个描述包使用注解修饰包、达到修饰该包下的类声明包中使用的类和常量(这个比较少用)描述包package-info.java 文件/** * 我是描述信息 */package com.demo.test.info;生成 JavaDoc 可以看到包的注释在说明列中使用注解修饰包假如某个包下、我们希望所有的返回值都应该非 Null、并且当我们编码的

2022-05-14 10:29:38 613

原创 Mybatis SqlSource

ublic interface SqlSource { BoundSql getBoundSql(Object parameterObject);}BoundSql 包含了解析之后的 SQL 语句(sql 字段)、每个“#{}”占位符的属性信息(parameterMappings 字段 ,List 类型)、实参信息(parameterObject 字段)以及 DynamicContext 中记录的 KV 信息(additionalParameters 集合,Map<String, O.

2022-05-14 08:15:00 551

原创 Mybatis 解释 mapper 文件

我们知道 Mybatis 在解释配置文件的时候使用的是 XMLConfigBuilder、在解释 mapper 标签的时候、为每个 Mapper.xml 文件创建一个 XMLMapperBuilder 实例解释 mapper 文件。public void parse() { if (!configuration.isResourceLoaded(resource)) { configurationElement(parser.evalNode("/mapper")); configu.

2022-05-13 10:00:00 756

原创 Mybatis SqlNode

我们在以前的文章中曾经介绍过 OGNL 强大的表达式引擎我们知道在 BaseExecutor#query 中@Overridepublic <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException { BoundSql boundSql = ms.getBoundSql(param.

2022-05-13 08:30:00 321

原创 Mybatis 解释配置文件

我们知道 Mybatis 的入口是 SqlSessionFactoryBuilderpublic SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return bu.

2022-05-12 22:53:47 291

原创 Mybatis 缓存与装饰模式

装饰模式是一种结构型设计模式、允许你通过将对象放入包含行为的特殊封装对象中来为原来帝乡绑定新的行为。俗称套娃。装饰模式中、封装器实现了与其封装对象相同的接口、封装器的成员变量可以是该接口的任意实现。Mybatis 中的装饰模式Cache 接口是 Mybatis 缓存中顶层的抽象接口、定义了 Mybatis 缓存最核心最基础的行为public interface Cache { String getId(); void putObject(Object key, Object va.

2022-05-12 22:51:20 170

原创 Mapper 文件与接口的映射

我们在使用 Mybatis 的时候、只需要定义一个 Mapper xml 文件和一个对应的 Mapper 接口、并需要实现该接口、即可在程序中使用该 Mapper 接口、调用里面的方法对其进行查询(当然 xml 中的 namespace 要关联接口)。那么这个功能是怎么实现的呢 ?MapperRegistry我们知道在使用 Mybatis 的时候都会去创建一个 Configuration 类、而在这个类中、则会创建一个 MapperRegistrypublic class MapperRegist.

2022-05-12 22:50:28 1182

原创 Mybatis 与 代理模式

我们经常在工作中使用到 AOP 、在设计模式中、它属于代理模式。代理模式属于一种结构性设计模式、让你能够提供对象的替代品或占位符。代理控制着对于远对象的访问、并允许在将请求提交给对象前后进行一些处理。JDK 中的动态代理核心类就是 InvocationHandlerMybatis 中代理模式也是在日志模块中、这些代理类从其名字中可以猜测出其用来打印日志public final class ConnectionLogger extends BaseJdbcLogger implemen.

2022-05-12 22:49:33 633

原创 Mybatis 日志与设计模式

原有系统已经从各个供应商中获取到航班数据、格式为 XML、并且将该数据传输给一个智能分析系统中做统计分析。最近业务改动、对接了一个新的智能分析系统、但是对方的输入格式为 Json、这个时候我们该怎么办?我们可以创建一个适配器、该适配器实现原来的智能分析接口、在适配器里面做 XML 到 JSON 的转换、然后再真正的调用新的智能分析系统。对于应用系统而言、甚至可以不改动代码。Mybatis 的适配器模式现存主流的日志框架有 Logback、Log4j、Log4j2 等、但是大部分都是先使用 SLF..

2022-05-12 22:48:56 202

原创 Mybatis 整体架构

Mybatis 分为三层架构基础支撑层核心处理层接口层基础支撑层类型转换模块微信公众号:CoderLiJDBC类型与 Java 类型之间的相互转换、不管是入参还是结果集的转换、都是这个模块职责。还有一个功能就是类型别名、这个有点类似 Spring 的别名、为了引用的时候名称更加简短日志模块Mybatis 的日志模块通过适配器模式可以集成主流的各种日志框架、Log4J、Logback等反射工具模块Mybatis 的反射工具、如 MetaObject 提供了一些更加灵活的 API.

2022-04-02 07:52:53 867

原创 Mybatis 类型处理与别名

TypeHandler微信公众号:CoderLi数据库类型和 Java 类型之间的映射、在 Mybatis 中使用 TypeHandler 做这个转换public interface TypeHandler<T> { void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; T getResult(ResultSet rs, Stri.

2022-04-02 07:51:46 353

原创 UML中的关系

微信公众号:CoderLi常见的几种关系泛化实现关联聚合组合依赖泛化对应的 Java 就是继承、指定了子类如何特化父类的特征和行为带三角箭头的实线、箭头指向父类实现类与接口的实现、表示类实现了接口的所有特征和行为的实现带三角箭头的虚线、箭头指向接口关联是一种拥有的关系、它是一个类知道另一个类的属性和方法、如老师和学生、丈夫和妻子关联可以是双向的、也可以是单向的、双向的关联可以有两个箭头或者没有箭头、单向的关联只有一个箭头代码的体现、就是成员变量。带普通箭头的实心.

2022-04-02 07:50:31 176

原创 Spring 实例化顺序&循环依赖问题

今天讨论两个问题、一个是 Spring 实例化所有 bean 的顺序。第二个是循环依赖问题实例化顺序今天发现一篇文章这么描述我当时第一反应就肯定不太对、因为关于 Spring 实例化顺序这个、吃过大亏AbstractApplicationContext#finishBeanFactoryInitialization 中 // Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSi.

2022-03-29 07:34:46 555

原创 Java 持久层概述

JDBCJava Database Connectivity 是一系列接口规范。Java 程序都是通过 JDBC 连接数据库的、然后通过其执行SQL、对数据库进行操作。DBC 只是 Sun 公司定义的接口规范、具体实现是交由各个数据库厂商去实现的、因为每个数据库都有其特殊性、这些是 Java 规范没办法确定的import java.sql.*;import java.util.logging.Level;import java.util.logging.Logger;public clas.

2022-03-29 07:34:06 2199

原创 为什么不要使用 import *

Java 存在两种包的导入机制单类型导入、这个也是推荐并且也是常见常用的按需类型导入、这个是不推荐的、也就是我们常说的 import xxx.xx.*单类型导入仅仅是导入一个接口或者类、而按需导入也是仅仅导入当前类所需要使用的类、两者的差别只是对类文件的定位算法不一样。Java 编译器会从启动目录、扩展目录以及用户类路径目录去定位需要导入的类。这三个目录也是我们所说的类的顶级目录。编译器定位类文件的方法大概如下顶层路径名(也就是目录) \ 包名\文件名.class这三者加起来就是一个绝对

2022-03-29 07:33:00 1606

原创 Dubbo Diretory

Cluster 文章中我们提及到会从 Directory 中获取 invoker 列表AbstractDirectory 没有封装什么特别的逻辑protected RouterChain<T> routerChain;内部持有一个路由链@Overridepublic List<Invoker<T>> list(Invocation invocation) throws RpcException { if (destroyed) { .

2022-03-29 07:32:05 611

原创 Dubbo服务调用过程

前几篇文章讲述了 Dubbo 的注册和消费的流程、今天继续接着说下调用的流程(只谈及单注册中心、多注册中心只是前面多了一步、根据区域或者配置选择出其中一个注册中心而已)我们在消费者端调用就是该代理工厂返回的对象@Overridepublic <T> T getProxy(Invoker<T> invoker, boolean generic) throws RpcException { Set<Class<?>> interfaces = ne

2022-03-29 07:31:23 971

原创 Dubbo Cluster

Cluster 层集群容错层、该层中包含 Cluster、Directory、Router、LoadBalance几大核心接口@SPI(FailoverCluster.NAME)public interface Cluster { @Adaptive <T> Invoker<T> join(Directory<T> directory) throws RpcException;}这个版本有 10 种容错机制每个具体的 Cluster 实.

2022-03-29 07:30:15 287

原创 Dubbo Wrapper

今天谈谈 Dubbo 的 org.apache.dubbo.common.bytecode.Wrapper 类Dubbo 依赖该工具在服务提供者端接收处理请求的时候、直接调用提供服务的 service 相对于传统的反射、性能其实有很大的提升private static Wrapper makeWrapper(Class<?> c) { String name = c.getName(); ClassLoader cl = ClassUtils.getClassLoade

2022-03-27 16:26:17 475

原创 Dubbo服务消费过程

服务消费者端代码@DubboReference(version = "1.0.0")private DemoService demoService;public static void main(String[] args) { SpringApplication.run(DubboAutoConfigurationConsumerBootstrap.class).close();}@Beanpublic ApplicationRunner runner() { return

2022-03-27 16:25:46 539

空空如也

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

TA关注的人

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