自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 Java PECS(Producer Extends Consumer Super)原则

在看 Alibaba 开发守则时遇到 PECS 原则,刚才是阅读时感觉比较绕,也搜索了一些博文参考,个人觉得 Stackoverflow 的这篇文章比较实用 ——,Cat 继承 Animal,可以把 Cat 作为 Animal消费。方法中参数类型 T 是 E 的子类,T 中某些操作 E 是不能满足的。中的所有元素以其迭代器返回顺序添加到该 List 末尾。方法中参数类型 T 是 E 的父类,那么从集合。中获取的元素任何 E 类型的方法都可以调用该。中获取元素进行比较。后面结合 JDK 源码梳理了下。

2023-05-15 16:13:57 565 1

原创 Spring Boot v2.4.4源码解析(十)依赖注入原理下 —— 依赖解析

从《[Spring Boot v2.4.4源码解析(八)依赖注入原理上 —— 由一道面试题引起的思考《@Autowired和@Resource的区别》?](https://blog.csdn.net/u010141779/article/details/124269175)》可以看出,解析待注入字段或参数主要由 `org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveDependency(org.springf

2022-05-09 09:20:09 412 1

原创 Spring Boot v2.4.4源码解析(八)依赖注入原理上 —— 由一道面试题引起的思考《@Autowired和@Resource的区别》?

@Autowired 和 @Resource 属性注入分别是由 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor 处理,本文将从源码出发,解析这两种注解对属性注入区别。先看下 @Autowired 属性是如何注入的,AutowiredAnnotationBeanPostProcessor UML 类图如下从图中可以看出,其实现 MergedBeanDefinitionPostProcessor 接口,在该接

2022-05-09 09:19:06 365 1

原创 Spring Boot v2.4.4源码解析(九)依赖注入@Autowired注解使用方式

Spring 依赖注入

2022-04-28 09:03:28 599

原创 Highbit && Lowbit

我们知道计算机底层使用二进制表示数,而 highbit && lowbit 顾名思义就是求某数二进制最高位111和最低位111所表示十进制数。不管是 OI 还是计算机工程领域这两种算法运用都比较频繁。lowbitlowbit 算法在 OI 中应用比较广泛,比如树状数组等。在了解 lowbit 算法前先看一个问题 —— 求某数清零最低位 111 后变为多少?比如对于 404040,二进制表示为 101000101000101000,这里忽略所有高位 000,清零最低位 111 后变为

2022-04-26 23:03:17 1920

原创 Spring Boot v2.4.4源码解析(七)Bean 后置处理器 —— BeanPostProcessor管理机制

Bean后置处理器,该接口及其子接口可以在Bean生命周期中实现Bean实例定制化功能。Spring Bean 属性赋值、AOP代理等功能均是通过该接口实现,该接口重要性可见一斑。

2022-04-12 19:53:26 1249

原创 Mybatis | 例析各动态标签解析过程

从《Mybatis | 动态 SQL 原理分析》这篇博客可以了解到, Mybatis 在解析 SQl 映射语句时,将其视为树结构。树结构有一个及其重要特点 —— 树是通过递归定义的,即“一棵树由根节点和多个不相交子树构成”。

2022-01-17 08:25:04 374 2

原创 Mybatis | 开发实用技巧

本文主要分享了如下几个Mybatis实用技巧一、Foreach 安全操作,避免数据误伤二、使用内建别名三、调试 Ognl四、 Mapper 接口参数引用

2022-01-11 20:23:09 852 1

原创 Mybatis | 反射工具类大集合

MyBatis 要实现通过 XML 设置 JavaBean 到 SQL 参数和 JDBC 结果集到 JavaBean 之间映射规则,中间肯定少不了 Java 反射。Mybatis 将 Java 反射进行了封装,并将封装后的工具类放在包 org.apache.ibatis.reflection 下,比如该包下包含 Reflector,ReflectorFactory,MetaObject,MetaClass,BeanWrapper,PropertyTokenizer 等。

2022-01-11 09:00:00 343 2

原创 Mybatis | 动态 SQL 原理分析

日拱一卒无有尽,功不唐捐终入海。如果 SQL 语句中包含 trim | where | set | foreach | if | choose | when | otherwise | bind 标签或者字符串替换符「 $ 」,MyBatis 就认为其为动态 SQL,在执行时会根据 Mapper 接口方法传入的参数动态计算 SQl 语句。

2022-01-05 09:00:00 292

原创 Mybatis | 动态 SQL 基石 —— Ognl

动态 SQL 是 MyBatis 的强大特性之一。如果使用过 JDBC 或其它类似的框架,应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。除了 if, Mybatis 还支持 choose,when,otherwise,trim,where 等动态 SQL 元素,值得注意的是,这些元素中有些属性是需要通过表达式计算的,比如 if 元素的 test 属性。

2021-12-30 09:00:00 2039 1

原创 SqlSessionTemplate 如何保证线程安全性以及关联 Spring Framework 事务?

劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。本文基于源码,从如下几个着重点解决这个问题:DefaultSqlSession`线程不安全分析; SqlSessionTemplate 如何保证线程安全性; SqlSessionTemplate 如何管理 SQL 会话生命周期,包括关闭,提交或者必要时回滚等;SqlSessionTemplate 如何关联 Spring 当前事务;

2021-12-23 14:01:46 1028 1

原创 Mybatis 向 Spring IOC 容器注册的 Mapper 接口是啥?

本文源码使用到 Jar 包版本约束如下:Spring Boot,2.4.12;mybatis-spring-boot-starter,1.3.2;一、概述在 Spring Boot 下使用 Mybatis 开发项目过程中,通常步骤是先定义 Mapper 接口,然后再编写与其对应的 XML 映射文件,这样就可以在需要使用数据库表操作地方直接将 Mapper 注入进来使用即可。不需要写 Mapper 接口实现,好比 XML 映射文件就是 Mapper 接口实现一样。这里不禁就有一个疑问 —— My

2021-12-14 18:52:13 538 1

原创 从源码角度探索 Mybatis 插件注册方式

通过上一篇博客《深入 Mybatis 插件机制》了解了插件原理,并且 Mybatis 所有插件都保存在 Configuration 的 interceptorChain 属性中,在 Configuration 中提供了注册插件方法 addInterceptor(Interceptor interceptor) 将插件添加到 interceptorChain ,那用户怎么向 Configuration 注册插件呢?结合源码,本文分享了四种注册 Mybatis 插件方式:直接注册到 Spring IOC

2021-12-10 15:08:23 717

原创 深入 Mybatis 插件机制

在使用 Mybatis 查询时,通常会使用 PageHelper 分页插件分页,这样就可以不在 SQL 中写 limit 和 count ,比较方便。除此之外, Mybatis 插件还常用于数据脱敏,自动填充字段(全局唯一Id,数据生成时间,数据创建者,数据修改时间,数据修改者等等),数据库字段加密,水平分表,菜单权限控制,黑白名单等。Mybatis 插件用法和 Spring AOP 环绕通知很像,但是定义切点方式不同, 具体使用方法,可参考官方文档。Spring AOP 是通过代理实现,那 Myb

2021-12-09 15:26:51 567 2

原创 记一次 MySQL Intersection 索引合并

在一次 MySQL 慢 SQL 优化过程中, 用 EXPLAIN 发现某表访问 type 为 index_merge, 在 Extra 列中提示 Using intersect,而且 Using intersect 中两列均为等值匹配。什么是 index_merge 呢?index_merge 其实也是 MySQL 单表访问方法, 通常情况下访问单表是只会用到一个索引,MySQL将查询一张表时使用了多个索引的情况称之为index_merge,即索引合并,Intersection 是索引合并的一种算法。

2021-12-02 09:03:06 1419 10

原创 理解 Java 软引用、弱引用、虚引用及其使用场景

理解 JVM 软引用并构建缓存几乎所有允许动态分配内存的计算机语言都会遇见一个共同问题——如何“收集”不在使用的内存。有点和餐厅类似,开始时,餐厅的所有餐桌均处于空闲状态,可供顾客使用。但是,当所有餐桌都已经被分配给客户时,就需要检查哪些已经被分配的餐桌处于空闲状态。有些语言,比如C语言,把这个责任交给用户:分配到了内存,那么你就有责任释放内存。这就和快餐很像,用完餐后,需要把餐桌整理干净。所有顾客都处理正确,这种方式效率很高。...

2021-11-29 09:04:13 1840 2

原创 Spring Boot v2.4.4源码解析(六)属性绑定篇上 —— 类型安全配置属性

Spring Boot 属性绑定一、概述在Spring Boot下开发某个模块,如果这个模块配置属性比较多而且具有层级关系,使用@Value("${property}")注解依次注入这些属性显得比较麻烦。Spring Boot提供了另一种替代方案,可以使用@ConfigurationProperties注解将这些属性绑定到类上。例如,Mybatis将配置属性绑定到MybatisProperties类上:@ConfigurationProperties(prefix = MybatisProperti

2021-11-26 10:11:57 857 2

原创 Spring Boot v2.4.4源码解析(五)配置文件加载上 —— 2.4版本与2.3版本差异

Spring Boot 2.4版本与2.3版本处理配置文件差异

2021-11-16 14:29:51 2940 3

原创 Spring Boot v2.4.4源码解析(四)事件机制篇下

Spring Boot事件发布及监听机制事件驱动模型可以最大程度减少耦合度,而Spring拥有一套完善的事件发布与处理机制。在Spring中想完成一个完整的面向事件编程,需要以下三个步骤:自定义一个事件,该事件需要继承ApplicationEvent,参考Spring Boot v2.4.4源码解析(三)事件机制上;事件发布者注入ApplicationEventPublisher对象,用于发布事件;事件监听者实现ApplicationListener接口,或者使用@EventListener注解(

2021-11-08 09:00:50 1488 6

原创 Spring Boot v2.4.4源码解析(三)事件机制篇上

Spring Boot事件发布与订阅机制Spring boot启动方法SpringApplication#run(String...)中有很多关键时间节点:public ConfigurableApplicationContext run(String... args) { // ... SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(bootstrapContext, t

2021-11-02 11:02:12 1609 4

原创 Spring Boot v2.4.4源码解析(二)运行时环境Environment

Spring Boot当前引用运行环境Environment

2021-10-29 22:55:50 1716 2

原创 树上问题(一)倍增算法求最近公共祖先

倍增算法求最近公共祖先在图论和计算机科学中,最近公共祖先(英语:lowest common ancestor)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点。在这里,我们定义一个节点也是其自己的后代,因此如果v是w的后代,那么w就是v和w的最近公共祖先。 --维基百科上图中, LCA(11,8)=8LCA(11, 8)=8LCA(11,8)=8,LCA(11,9)=1LCA(11, 9)=1LCA(11,9)=1,LCA(7,8)=2LCA(7, 8)=2LCA(7,8)=2。求L

2021-10-21 09:54:47 467 3

原创 Spring Boot v2.4.4源码解析(一)字符串占位符解析器 PropertyPlaceholderHelper

Spring属性占位符解析器 PropertyPlaceholderHelper源码阅读PropertyPlaceholderHelper 用于处理字符串中"${}"这种占位符,比如通过@Value(“${}”) 注解获取对应属性文件中定义的属性值等(但不能处理@Value(“#{}”) , 表示通过SpEL表达式通常用来获取bean的属性)。该类是一个单纯的工具类,没有继承没有实现,而且简单无依赖,没有依赖Spring框架其他的任何类。先看下该类如何使用。该类主要构造函数如下:public Pr

2021-10-14 15:08:41 2151 4

原创 Java 常量符号

public class SymbolConstants { public static final char BACKSLASH = '\\'; public static final char BACKSPACE = '\b'; public static final String COMMA = ","; /** * Starts a comment, the remainder of the line is the comment. */

2021-10-12 10:39:22 729

原创 推断启动主类

力学如力耕,勤惰尔自知;世人若被明日累,春去秋来老将至,不能再这样恍恍惚惚下去了。希望不要在敲不动时还是一个只会写业务的蒟蒻。勉励前行。。。private Class<?> deduceMainApplicationClass() { try { StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement stackTraceElement

2021-10-10 00:24:24 50

原创 从源码角度解析Spring Bean 生命周期

Spring Bean生命周期是Spring中重要知识点,对于Bean的拓展十分重要。但想要完全记住整个生命周期并不容易,本文从源码入手解析Spring Bean的生命周期,结合示意图,比较容易记忆。首先,为方便记忆,将Bean的生命周期主要分为四个阶段,然后在这四个阶段之间穿插各种拓展点。这四类分别是:Instantiation 实例化Populate 属性赋值Initialization 初始化Destruction 销毁源码的入口在org.springframework.beans

2021-05-08 00:10:51 1243

原创 springframework AnnotatedElementUtils

springframework 注解工具类AnnotatedElementUtilsspringframework 注解工具类 org.springframework.core.annotation.AnnotatedElementUtils封装了常用注解方法。后续测试可能用到KafkaListeners和KafkaListener 注解, KafkaListeners为KafkaListener 的容器注解类。@Target({ ElementType.TYPE, ElementType.METHO

2021-04-29 10:25:55 683

原创 Spring 注解属性别名与覆盖

Spring 注解属性别名与覆盖在Spring 中将多个注解组合注解到一个注解上,这个注解就可以发挥被注解的多个注解功能。@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, cla

2021-04-27 20:55:56 1098 1

原创 AnnotatedElement

Java AnnotatedElementRepresents an annotated element of the program currently running in this VM.根据注释可以看出,AnnotatedElement代表在当前运行的java虚拟机中一个可以被注解的元素。在定义注解时,通过Target指定注解使用范围需要是枚举类ElementType。public enum ElementType { /** Class, interface (including

2021-04-23 11:26:58 331

原创 springframework 反射工具类 ReflectionUtils

springframework 反射工具类 ReflectionUtilsorg.springframework.util.ReflectionUtils 封装了常用反射操作。private static Field[] getDeclaredFields(Class<?> clazz);该方法使用Class#getDeclaredFields()返回该Class表示的类或接口声明的所有字段,包括public, protected, default (package) access, 和

2021-04-22 15:21:23 1346

原创 C++中的string用法简介

string是C++标准库的一个重要的部分,主要用于字符串处理,这里对常用成员函数按功能进行分类。1. 赋值可以用字符串常量,string变量,以及 char 类型的变量、常量对 string 对象进行赋值;string s1, s2, s3;s1 = "Hello"; // s1 = "Hello"s2 = 'K'; // s2 = "K”s3 = s1; // s3 = "Hello"2. 输入cin>> 可以实现将以空格或回车(任何空白字符)为 “结束符” 的字符序

2021-04-02 23:01:40 746

原创 一种Kafka消息传输可靠性及容错性方案

在实际项目中,几乎都会用到消息队列。就像微服务一样。对于消息队列的选型,需要根据不同消息队列特定能否满足项目需求而定。在最近几年,Kafka 大幅增加其市场份额。除了微服务和消息队列,还有一种已经比较流行的架构模式,即 Event Sourcing(事件溯源)。Event Sourcing 有几个特点:整个系统以事件为驱动,所有业务都由事件驱动来完成。事件是一等公民,系统的数据以事件为基础,事件序列需要保存在某种存储介质上。业务数据只是一些由事件产生的视图,不一定要保存到数据库中。Kafka 所

2021-03-09 20:37:36 319 1

原创 Elasticsearch 文章整理

看到一些好的关于Elasticsearch 的文章,但是使用chrome,有些情况下不能登录账号收藏,所以统一整理到这里。Elasticsearch索引生命周期管理方案

2021-02-26 08:09:04 142

原创 # 滴滴 Tinyid 原理分析

一、 生成全局唯一ID三个思路基于数据库生成;基于分布式集群协调器生成(ZooKeeper, Consul ,Etcd等);划分命名空间并行生成(Snowflake为代表);二、Tinyid实现原理号段Tinyid 基于第一种思路生成全局唯一ID。如果使用db的auto_increment,虽然实现简单、但性能比较差,对db访问比较频繁,db的压力会比较大。Tinyid解决了该问题,主要实现思路为一批id,可以看成是一个id范围,例如(1000,2000],这个1000到2000也可以称为一

2021-02-19 23:38:05 449

原创 # Twitter雪花算法(Snowflake)

Twitter雪花算法(Snowflake)The ProblemWe currently use MySQL to store most of our online data. In the beginning, the data was in one small database instance which in turn became one large database instance and eventually many large database clusters. For vari

2021-02-10 17:25:35 220

原创 某个时间点后修改的所有文件名

某个时间点后修改的所有文件名在合代码时候,为了防止漏合,通常会罗列出某个时间点后自己修改过的所有文件名,然后合并每个文件修改的内容。这里使用git log命令解决这个问题。git log命令格式:git log [<options>] [<revision range>] [[--] <path>…​]常用选项--since=<date>--after=<date>展示某个时间点后的提交。--until=<date>

2021-01-19 20:40:26 244

原创 骚操作,利用正则表达式判断素数!!!

利用正则判断素数判断素数有很多方法, 比如定义法,费马小定理,米勒-拉宾素性检验,Solovay-Strassen素性判定等。一、定义法这种方法利用素数定义来判断素数。素数又叫质数,质数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。最小的质数是2,它也是唯一的偶数质数,最前面的质数依次排列为:2、3、5、7、11、13、17、19、23、29、31等。static boolean isPrime(int n) { if (n <= 1)

2020-12-19 15:42:07 363 1

原创 Spring Boot 原理之初始化篇

Spring Boot 原理之初始化篇通常在String Boot 中通以下如下代码启动Spring Boot。代码很简洁,通过一行代码就能启动整个Spring Boot工程。在这行代码中通过调用SpringApplication静态方法run,并传入启动类class和主函数参数来启动。在润方法中又将启动类class封装成数组,并用这个数组构造了一个SpringApplication。我们看下SpringApplication构造函数。在构造函数中,调用了一个初始化方法initialize,这个

2020-12-18 22:06:52 252

原创 MySQL READ+CHECK+UPDATE并发问题

MySQL SELECT+CHECK+UPDATE并发问题背景在工作常常遇到先查询数据,在数据满足某种条件情况下再更新数据。比如,在需要大批量采购某商品时,通常采购方与供应商签订固定金额的协议,在需要采购时,先检查合同剩余金额是否足够,然后再下单并更新合同剩余金额。但查询到更新之间存在时间差,如果在查询到更新之间有其他用户并发更新协议信息,则会导致判断不准确,发生采购金额超出协议金额情况。...

2020-12-13 23:54:52 595 1

ios网络编程

本文件是zip文件。 主要用于计算机类的ios系统的网络开发。

2015-09-15

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

TA关注的人

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