自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小识的博客

放弃很容易,但坚持一定很酷

  • 博客(490)
  • 资源 (15)
  • 论坛 (1)
  • 收藏
  • 关注

原创 2w字搞懂Spring AOP的前世今生

Spring AOP概述我们在使用Spring框架的时候,经常需要和Spring的2大特性,IOC和AOP打交道,之前写了一篇《2w字搞懂Spring Bean的一生》从源码层面分析了IOC的执行流程,本篇文章就接着分一下AOP的底层实现,比较基础的内容本篇文章就不多做介绍了AOP这种设计理念设计的概念如下AOP的主要应用场景如下Spring AOP的实现主要经历了2代第一代:Spring自己实现了AOP的功能第二代:Spring集成了AspectJ的实现Spring AOP一代当我们.

2021-09-26 14:59:44 961

原创 分布式事务:TCC

seata-tcc-tmapplication.yamlserver: port: 30002spring: application: name: seata-tcc-tm datasource: driver-class-name: com.mysql.jdbc.Driver url : jdbc:mysql://myhost:3306/db_account_2?useUnicode=true&characterEncoding=utf8 us.

2021-09-21 16:28:19 34

原创 分布式事务:Seata AT模式

Seata AT模式的demogithub地址:https://github.com/erlieStar/spring-cloud-distributed-transactionSeata AT和XA模式的代码基本上一摸一样,就是开启数据源代理的时候不用在指定模式了,因为默认为AT模式另外还需要在db_account_1和db_account_2库中建如下两张表,seata框架会用到CREATE TABLE `undo_log`( `id` bigint(20) .

2021-09-21 13:39:50 12

原创 面试官:分布式ID的生成策略有哪些?

介绍在很多业务系统中,我们经常会遇到生成全局唯一的分布式ID的需求,如IM系统,订单系统等。那么生成全局唯一的分布式ID的方法有哪些呢?UUID// 3eece1c6-5b57-4bce-a306-6c49e44a1f90UUID.randomUUID().toString()本地生成,生成速度快,但识别性差,没有顺序性可以用来标识图片等,不能用作数据库主键数据库自增主键我们原来刚开始做IM系统的时候就单独建了一个表来获取自增id作为消息的ID,单独开一张表来获取自增id也不会影响对消息.

2021-09-19 16:02:48 72

原创 分布式事务:XA规范

XA规范二阶段提交协议是一个协议,而XA规范是X/Open 组织针对二阶段提交协议的实现做的规范。目前几乎所有的主流数据库都对XA规范提供了支持。这样做的好处是方便多个资源(如数据库,应用服务器,消息队列等)在同一个事务中访问。你可以类比JDBC我们这篇文章就以MySQL XA为例演示一下XA怎么玩?MySQL XA常用的命令如下命令解释XA START xid开启一个事务,并将事务置于ACTIVE状态,此后执行的SQL语句都将置于该事务中XA END xid将事务.

2021-09-16 20:43:07 75

原创 面试官:MySQL事务的隔离性是如何实现的?

并发场景最近做了一些分布式事务的项目,对事务的隔离性有了更深的认识,后续写文章聊分布式事务。今天就复盘一下单机事务的隔离性是如何实现的?隔离的本质就是控制并发,如果SQL语句就是串行执行的。那么数据库的四大特性中就不会有隔离性这个概念了,也就不会有脏读,不可重复读,幻读等各种问题了对数据库的各种并发操作,只有如下四种,写写,读读,读写和写读写-写事务A更新一条记录的时候,事务B能同时更新同一条记录吗?答案肯定是不能的,不然就会造成脏写问题,那如何避免脏写呢?答案就是加锁读-读MySQL读操.

2021-09-04 12:02:47 839 8

原创 复杂度分析:如何进行时间复杂度和空间复杂度分析?

如何衡量算法的优劣?对于同一个问题,可能有很多种解决的套路,这个解决问题的套路就是算法。比如有如下一个问题,1-100的和是多少你可以能会写出如下方案for (int i = 1; i <= 100; i++) { sum += i;}如果你的数学基础稍微好一点,你可能就会写出如下解决方案sum = (1 + 100) * 50;这2个方案哪个好呢?你肯定会说第二个,因为第二个执行的时间更短。我们一般从时间 和空间 方面衡量算法的时候复杂度时间复杂度:执行当前算法所耗费.

2021-08-30 16:00:20 42

原创 队列:从普通队列到单调队列

优先队列队列也是一种被频繁使用的数据结构。队列主要分为有如下三种普通队列:消息队列就是一种普通队列,用来进行进程间通信优先队列:银行排队办理业务这种场景就能用到,如果有vip客户,则先给vip客户服务,没有vip客户,则按照排队次序服务单调队列:用来求滑动窗口的最值合并K个升序链表题目地址:LeetCode 23. 合并K个升序链表给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。输入:lists = [[1,4,5],[1,3,4],[2.

2021-08-26 19:54:29 40

原创 栈:从普通栈到单调栈

栈的应用场景栈是一种先进后出的数据结构(类比弹夹),在程序执行过程中,栈可以说是应用最广泛的数据结构之一了。Java方法执行的时候会把方法的相关信息封装到一个栈帧放入虚拟机中。例如当methodOne调用methodTwo,methodTwo调用methodThree执行时,虚拟栈如下所示。当methodThree执行完毕则会出栈,methodTwo执行完毕出栈。即方法调用入栈,方法执行出栈简单的一个表达式计算的过程也会用到操作数栈(100+200)*300的计算过程如下将100入栈将2.

2021-08-24 17:32:13 50

原创 搜索:DFS和BFS遍历图的方式有哪些不同?

应用场景DFS和BFS都是对图进行遍历的算法(树的图的一种),二者的区别只是对图遍历的策略不同DFS:按照一个方向遍历,直到不能遍历了,才换一个方向遍历。BFS:从起点开始,依次对周边的节点进行遍历,遍历完再对周边节点的周边节点再进行遍历,以此类推,直到把图遍历完。我们以迷宫演示一下DFS和BFS遍历的过程。假设有一个4*4的迷宫,其中标为红色的区域不能经过,问能否从迷宫的(0,0)这个坐标移动到(3,3)这个坐标我们遍历时要按照一个固定的策略对每个节点的4个方向都进行遍历,这样才不会漏掉,假设.

2021-08-23 19:20:25 36

原创 递推和递归:一个自下而上,一个自上而下

解决问题的思路不同递推和递归是常见的解决问题的思路,在很多算法中都会用到,例如DFS算法基于递归实现,动态规划算法基于递推实现。递推是从上到下解决问题,如想知道一个国家有多少人,我们从村这个一个行政级别开始,依次向上汇报,最后到国这个级别就能知道一个国家有多少人递归是从上到下解决问题,如想知道一个国家有多少人。国家发布命令让各个省上报各自的人数,各个省又发布命令让各自市上报各自的人数,依次类推,最后到达村这个级别,开始统计自己的人数(递推出口),统计完后逐级上报,最后到国这个级别就能知道一个国家有多.

2021-08-22 20:58:14 38

原创 树:熟练手写树的四种遍历方式

树的四种遍历方式树也是一种用来提高查询效率的数据结构(和哈希表类似)。例如MySQL中的索引就可以基于B+树或者哈希表构建,MongoDB用B树(也称为B-树)来实现索引。很多关于树的面试题其实都不难,基本上是基于树的四种遍历方式来实现的,所以熟练手写树的四种遍历方式非常重要我们先说前中后序这三种遍历方式前序遍历:根,左,右中序遍历:左,根,右后序遍历:左,右,根发现规律没?左右的位置始终不变,前序遍历,根在前面,中序遍历,根在中间,后序遍历根在最后。前序遍历:A B C D E F.

2021-08-22 18:30:57 59

原创 动态规划:更高效的穷举!

介绍动态规划并不是一种具体的算法,而是一种思想,个人觉得就是缓存+枚举,把求解的问题分成许多阶段或者多个子问题,然后按顺序求解各子问题。前一子问题的解为后一子问题提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。所以动态规划一般用来求最优解(对子问题进行决策),求种类数(对子问题进行加和)先分享几个经典的动态规划实现,后续再分析几个面试题最长上升子序列来源:LeetCode 300.

2021-08-22 17:35:40 29

原创 哈希:更高效的查找!

面试必问的HashMap我们在开发的过程中经常会用到HashMap来保存键值对,实现的主要思路,就是通过hash函数确定对应的key应该放在数组的哪个位置。当要放的位置发生冲突时,就需要解决冲突,一般情况下有两种如下方法开放寻址法(当要放的位置上有值的时候,依次找数组的下一个位置,看是否有空位)链表法(用链表存储发生冲突的元素)当我们想要保证放入的key有序时,我们就可以用LinkedHashMap,LinkedHashMap=哈希表+双向链表哈希算法在Java中的应用有集合类HashM.

2021-08-22 17:33:24 40

原创 开篇:拒绝盲目刷题,如何更高效的学习算法?

为什么要学习算法?相信很多人的答案是为了面试。因为普通开发工程师在工作中用到复杂算法的概率很低那么面试官为什么要面试算法呢?考算法的本质是考智商,算法学的好的同学智商都不会太差,智商高也就更容易解决工作中遇到的问题优中选优(俗称内卷),当大家八股文都背的很六的时候,只能通过更难的东西来筛选一下了如何提高算法水平呢?在校生可以多参加算法竞赛,例如ACM国际大学生程序时机竞赛(能深刻认识到人与人之间的差距有多大,哈哈),中国大学生程序设计竞赛(CCPC),蓝桥杯,各种在线的算法竞赛如,Co.

2021-08-22 14:39:45 48

原创 排序:如何手写堆排序?

堆这篇文章我们来手写一下堆排序,首先我们来解释一下什么是堆?堆是一种数据结构,需要满足如下几个特性堆是一颗完全二叉树(生成节点的顺序是从左往右,从上往下依次进行)堆中某个节点值总是不大于或者不小于其父节点的值将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆大根堆和小根堆如下图所示假设有如下一个完全二叉树,如何将它调整为一个堆呢?可以看到10及其子节点符合条件,3及其子节点符合条件,4这个节点不符合条件。所以要对4这个节点进行调整,调整的过程称为heapify.

2021-08-19 23:42:23 52

原创 回溯:就是一个遍历决策树的过程

从八皇后问题说起八皇后问题是一个古老的非常有意思的问题。时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。此时我们就可以枚举所有的可能性,如下图为一个4皇后枚举的过程。当然枚举的过程我们并不是想到啥就写啥,而是按照一定的规则,枚举所有的可能性。按照行和列依次递增来枚举所有的可能性。第0行依次在第0,1,2,3列放第一个,接着放第二行。在枚举的过程中,.

2021-08-18 00:12:46 51 1

原创 排序:十大经典排序算法有哪些应用?

冒泡排序从头开始,依次比较数组中相邻的2个元素,如果后面的数比前面的数大,则交换2个数,否则不交换。每进行一轮比较,都会把数组中最大的元素放到最后面。如下图,一轮比较的过程如下当数组中有n个元素时,只需要进行n轮比较,则整个数组就是有序的public static void bubbleSort(int[] a) { // 进行i轮比较 for (int i = 0; i < a.length - 1; i++) { for (int j = 0; j < .

2021-08-15 19:15:52 73

原创 链表:指针操作有点乱?这些技巧要记好!

链表不难,但是容易乱当我们遇到链表类型的面试题时,一般都不会太难。但是很容易写错,因为经常容易搞错链表的指向关系,并且忽略对边界的处理。本节我们就以常见的链表题给大家演示几个常用的小技巧假头新链表双指针后面演示用到的链表类定义如下public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } .

2021-08-14 18:30:31 24

原创 贪心:每次都选局部最优解

思想很简单的贪心贪心算法是在每一步选择中都采取当前最好的或者最优的选择,从而导致最终的结果是最好的或者最优的。贪心算法可以解决解决一些最优化问题,如求图中的最小生成树,求哈夫曼编码。算法的思想还是比较容易理解的,难的是问题能否用贪心解决,贪心的具体策略是什么?如,给你一箱苹果,最多只能拿三个,你会怎么选择?肯定每次都是拿最大的了,这样最终拿到的苹果肯定是最重的但是有些问题,如果每次都是选择局部最优解,有可能最终结果不是最优解如有这样一个数塔,一个人可以从一个格子移动到和它相邻的2个格子,从塔顶.

2021-08-11 23:33:31 120

原创 二分查找:如何优雅的确定搜索区间?

二分思路和模版二分这种算法我们在很小的时候肯定就已经接触过了,很多智力题都可以用二分来解决。比如AB2地之间的电线断了,如何快速确定电线在哪里断了?我们每次都是到一段电线的中间去找给12个小球和一个天平,其中一个小球的质量和其他的小球不同,称3次把那个质量不同的小球找出来二分算法最主要的应用场景就是判断指定数在有序数组中是否存在,注意是有序数组二分算法可以算作是双指针的一种经典应用。二分算法的模版如下所示,其中变化的部分就是确定搜索区间的过程,我们要根据搜索区间的不同来赋不同的值。publ.

2021-08-08 23:33:34 44

原创 位操作:省时间,省空间,提效率

三种常见的位操作记得我刚玩Linux系统的时候,经常会遇到权限不足的问题,然后一个chmod 777 命令就稿定了。这个命令背后做了啥事呢?我们还得从Linux文件聊起Linux下一个文件一经创建,就具有三种访问方式读,可以显示该文件的内容写,可以编辑或删除它执行,如果该文件是一个shell脚本或者程序按照所正对的用户,文件的权限可以分为三类文件属主,创建该文件的用户同组用户,文件属主所在用户组的任何用户其他用户,不包含文件属主的其他用户组中的用户[root@VM_0_14_c.

2021-08-08 12:50:08 19

原创 面试官:说一下JVM内存分配策略?

JVM运行时数据区Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域其中方法区和堆是所有线程共享的数据区。程序计数器,虚拟机栈,本地方法栈是线程隔离的数据区虚拟机栈和本地方法栈中的空间会随着方法的调用和完成而不断分配和释放。应用中创建的对象则会被分配到堆中,当对象不在使用的时候会.

2021-07-23 19:55:53 388 1

原创 面试官:说一下类加载的过程

加载当我们要使用一个类的时候,要通过ClassLoader将类加载到内存中类加载阶段主要完成如下三件事情通过全类名,获取类的二进制流解析类的二进制流为方法区内的数据结构创建一个java.lang.Class类的实例,表示该类型,作为方法区这个类的访问入口通过全类名,获取类的二进制流的方式有很多种从zip压缩包中获取从网络中获取运行时计算生成,如动态代理技术…对于非数组类型的加载阶段,即可以使用Java虚拟机内置的类加载器去完成,也可以使用用户自定义的类加载器去完成链接链接.

2021-07-22 15:08:01 3098 11

原创 618核心服务内存溢出,P0安排上了

P0事故安排上来原来以为内存溢出这种事情只会发生在书本上,没想到在我们生产环境发生了,而且是618,P0事故安排上了。先回顾一下内存溢出排查的基本思路,然后再来复盘一下内存溢出发生的原因内存溢出排查我们先来了解一下Java堆的组成机构。对于大多数应用来说,Java堆(Java Heap)是Java虚拟机锁管理的内存中最大的一块。Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存堆的结构如下新生代老年代的具体划分比.

2021-06-26 17:31:59 170 2

原创 Dubbo源码解析:BeanFactory,封装复杂Bean的创建过程

创建Bean的方式常见的创建Bean的方式有如下四种通过构造器通过静态工厂方法通过Bean工厂方法通过FactoryBean@Data@ToStringpublic class User { private Long id; private String name; public static User createUser() { User user = new User(); user.setId(1L); user.setName("li"); retu.

2021-06-17 20:36:16 63

原创 Dubbo实战:如何保证接口幂等

介绍幂等性就是同一个操作执行多次,产生的效果一样。如http的get请求,数据库的select请求就是幂等的在分布式系统中,保证接口的幂等性非常重要,如提交订单,扣款等接口都要保证幂等性,不然会造成重复创建订单,重复扣款,那么如何保证接口的幂等性呢?Dubbo在进行服务调用的时候,如果调用失败,默认会重试2次,此时保证接口的幂等性就非常重要了。前端保证幂等性的方法按钮只能点击一次用户点击按钮后将按钮置灰,或者显示loading状态RPG模式即Post-Redirect-Get,当客户提交表.

2021-06-17 15:59:08 166

原创 Dubbo源码解析:Dubbo SPI是如何实现 AOP,IOC,自适应,自动激活的?

ExtensionLoader的工作原理Dubbo在启动的时候默认会扫描这三个目录下的配置,以加载需要的扩展类/META-INF/services/META-INF/dubbo/META-INF/dubbo/internalExtensionLoader是Dubbo SPI中用来加载扩展类的,有如下三个重要方法,搞懂这3个方法基本上就搞懂Dubbo SPI了。加载扩展类的三种方法如下getExtension(),获取普通扩展类getAdaptiveExtension(),获取自适应扩展类.

2021-06-17 11:54:46 124 3

原创 手写RPC框架:Spring Bean 生命周期详解

基本概念我们将自己写的RPC框架和Spring进行整合,分析Dubbo源码的时候,都要对Spring Bean的生命周期有一个清晰的理解,所以这一节我们就分析一下Spring Bean的生命周期Spring是一个IOC容器当我们不用Spring进行开发时,我们需要在代码中设置对象的依赖关系。当我们用了Spring之后,由Spring来管理这种依赖关系,当我们想使用对象时,直接从Spring容器中获取即可BeanDefinition在Spring中对象被叫做Bean,因为Spring Bean在J.

2021-06-16 21:09:19 64

原创 Dubbo源码解析:基于注解配置原理解析

使用注解开发一个Dubbo应用客户端@Component("demoServiceComponent")public class DemoServiceComponent implements DemoService { @Reference private DemoService demoService; @Override public String sayHello(String name) { return demoService.sayHe.

2021-06-16 21:00:39 90 2

原创 Dubbo面试:高频面试题汇总

Dubbo服务注册和发现的流程各种角色如下Provider:暴露服务的服务提供方Consumer:调用远程服务消费方Registry:服务注册与发现注册中心Monitor:监控中心和访问调用统计Container:服务运行容器Dubbo服务注册和发现的流程如下服务容器Container负责启动,加载,运行服务提供者。服务提供者Provider在启动时,向注册中心注册自己提供的服务。服务消费者Consumer在启动时,向注册中心订阅自己所需的服务。注册中心Registry返回服.

2021-06-16 14:39:39 212 3

原创 生产问题:@Reference注入为空

线上发生事故了有一次我负责的系统和收银系统同时上线一波(用的是Dubbo)。然后很神奇的事情发生了,收银系统用@Reference注解注入我的接口,然后这个接口的实现类居然为空。其实我们当时没排查出来是什么原因?重启了一下就好了,毕竟重启大法好。 但本着不能给用户充钱的路上造成阻碍,还是要排查一波这个代理对象为空是如何造成的。线上dubbo的版本为2.8.9,注意包名是(com.alibaba)为了方便大家理解我说的内容,简单说一下RPC框架的执行流程。Server将服务信息注册到Regi.

2021-06-13 14:23:58 75

原创 生产问题:线程池被打满

线程池被打满的原因有哪些当系统中接口的响应时间过长或者直接拒绝响应时,你此时里面就应该想到的是Dubbo线程池是否被打满了?然后去监控系统看一下线程池的活跃连接数。Dubbo线程池被打满应该是一个很常见的问题,那么线程池为什么会被打满呢?public class FixedThreadPool implements ThreadPool { @Override public Executor getExecutor(URL url) { String name = .

2021-06-13 14:23:01 337 4

原创 Dubbo实战:Dubbo的前世今生

分布式系统的架构演进过程Dubbo框架的出现是分布式系统演进的结果,我们先来回顾一下分布式系统的演进过程1 单应用架构2 应用服务器和数据库服务器分离单机负载越来越来,所以要将应用服务器和数据库服务器分离3 应用服务器做集群每个系统的处理能力是有限的,为了提高并发访问量,需要对应用服务器做集群分布式和集群的概念经常被搞混,现在一句话让你明白两者的区别。分布式:一个业务拆分成多个子业务,部署在不同的服务器上集群:同一个业务,部署在多个服务器上例如:电商系统可以拆分成商品,订单,用户等.

2021-06-12 20:58:31 223 3

原创 Dubbo源码解析:服务目录和路由

介绍之前的文章我们详细说了服务调用的过程,今天我们就来细化一下MockCluster到FailoverClusterInvoker的调用过程。当我们有多个服务提供者时,需要根据不同的策略从众多的提供者中选出合适的Invoker来发起调用,那么这些Invoker存放在哪?就在服务目录中。服务目录还会根据路由策略策略对最终返回的Invoker进行再次过滤。比如ip为A的Consumer只能让它调用ip为B的producer,路由的配置有很多方式,我们详聊。整体的流程下如图所示Invoker从D.

2021-06-12 10:29:53 198 1

原创 @Reference注入为空

线上发生事故了前天晚上上线一波,发生了一个挺有意思的事,昨天复盘了一下,分享一下。晚上的时候,我负责的系统和收银系统同时上线一波(用的是Dubbo)。然后很神奇的事情发生了,收银系统用@Reference注解注入我的接口,然后这个接口的实现类居然为空。其实我们当时没排查出来是什么原因?重启了一下就好了,毕竟重启大法好。 但本着不能给用户充钱的路上造成阻碍,还是要排查一波这个代理对象为空是如何造成的。线上dubbo的版本为2.8.9,注意包名是(com.alibaba)为了方便大家理解我说的内容.

2021-06-10 22:15:48 426 4

原创 Dubbo面试:Dubbo中用到了哪些设计模式?

介绍策略模式这个毫无争议,Dubbo是基于SPI来扩展的,SPI就是典型的策略模式。Dubbo中可替换的组件太多了,例如负载均衡策略实现类解释RandomLoadBalance随机策略(默认)RoundRobinLoadBalance轮询策略LeastActiveLoadBalance最少活跃调用数ConsistentHashLoadBalance一致性hash策略工厂模式简单工厂模式:提供一个方法,返回创建好的对象public clas.

2021-06-07 14:37:38 243 4

原创 手写RPC框架:基于Java SPI的可扩展版

封装服务接口在之前的章节中,我们基于Java Socket实现了一个极简版本的RPC框架,了解了其实现的大概套路,本节我们就基于Java SPI写一个可扩展的RPC框架。各种组件都有对应的接口,如果你想替换某一个组件的实现,只需要重写接口的实现类,配置一下即可。老规矩,先封装一个获取学生信息的公共接口public interface StudentService { Student getStudentInfo(Integer id);}@Data@Builder@NoArgsC.

2021-06-05 15:21:16 161 6

原创 手写RPC框架:基于RPC框架封装一个spring-boot-starter

介绍整合的逻辑非常简单,只写了2个注解,1个自动装配的类和2个扩展类开发注解服务引入注解,用在需要进行远程调用的接口上@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface RpcReference {}服务导出注解,我这里取巧了一波,在这个注解上加了@Component注解,这样被这个注解标记的类就能被注入到spring容器中。更优雅的实现方式是,自己扫描加了RpcService.

2021-06-04 16:55:26 255 7

原创 手写RPC框架:5分钟极速入门Netty的使用

介绍当我们用Netty开发网络应用程序时,一般只需要写对应的ChannelHandler即可,在ChannelHandler中处理业务逻辑Channel是网络通信的载体,你可以把它认为是一个实际的物理连接,Channel有很多种事件,如连接建立,连接关闭,数据读取。随着事件的发生会让Channel处于不同的生命周期,当对应的事件发生时,会回调ChannelHandler接口的对应方法事件回调方法解释channelRegisteredChannel创建后被注册到EventLoop.

2021-06-02 19:37:36 84 2

Qt实现多语言的切换

Qt实现国际化,能切换程序的语言

2017-02-25

将doc文件批量转为docx文件,用python将doc文件批量转为docx文件

用python将doc文件批量转为docx文件,用python将doc文件批量转为docx文件,

2017-12-28

FTPServer(windows绿色版)

FTPServer(windows绿色版),FTPServer(windows绿色版)

2018-01-19

mybatis-generator-core-1.3.5.jar

支持接口和XML更名的mybatis-generator,具体使用参考 https://blog.csdn.net/zzti_erlie/article/details/99606620

2019-08-15

用Python将Word中的内容写入Excel

用Python将Word中的内容写入Excel

2017-08-28

Qt实现字体文件的加载和删除

Qt实现字体文件的加载和删除

2017-02-25

Qt加载字体文件删除字体文件

Qt加载自己的字体,不用系统提供的QFontComboBox

2017-02-25

Qt5串口助手

用Qt5自身的类库开发的串口助手

2016-09-26

剑指offer高清完整目录版

剑指offer高清完整目录版剑指offer高清完整目录版剑指offer高清完整目录版

2018-01-23

MongoDB权威指南第2版(书签,高清).zip

MongoDB权威指南第2版(书签,高清).zip,MongoDB权威指南第2版(书签,高清).zip

2019-05-14

Linux系统命令及Shell脚本实践指南

Linux系统命令及Shell脚本实践指南,书签,清晰,完整版

2019-04-17

Maven实战(高清完整带书签)

Maven实战高清完整带书签,Maven实战高清完整带书签,Maven实战高清完整带书签,Maven实战高清完整带书签

2018-01-09

Spring MVC学习指南

Spring MVC是Spring框架中用于Web应用快速开发的一个模块,其中的MVC是Model-View-Controller的缩写。作为当今业界最主流的Web开发框架,Spring MVC已经成为当前最热门的开发技能,同时也广泛用于桌面开发领域。, 本书重在讲述如何通过Spring MVC来开发基于Java的Web应用。全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,本书还配有丰富的示例以供读者练习和参考。, 本书是一本Spring MVC的教程,内容细致、讲解清晰,非常适合Web开发者和想要使用Spring MVC开发基于Java的Web应用的读者阅读。

2017-10-13

Qt5串口助手V2.0(能记录上次打开的文件)

Qt5串口助手V2.0(能记录上次打开的文件)

2016-09-27

Qt实现语言切换

Qt实现语言切换

2017-02-23

Java识堂的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

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

TA关注的人 TA的粉丝

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