阿里九年架构师教你如何学会阅读源码

《通用源码阅读指导书-MyBatis源码详解》笔记一(MyBatis概述、使用、源码大体执行流程、源码大体结构) 本篇文章主要是看了书籍如下几个章节后进行的笔记总结:第1章-源码阅读第2章-MyBatis概述第3章-MyBatis运行初探第4章-MyBatis源码结构概述 额,对于这个问题我能说看源码是为了面试吗???emmmmm,当然不能的。 阅读源码是一个优秀软件开发者必备的能力很多时候我们接手一个前辈遗留项目的时候,这个时候千万不能慌,打开idea开始看代码,看有没有类似Thread.sleep的核心代码,如果有的话,那么我们就可以通过注释的方式优化系统。所以,熟悉一个项目就需要去看源码,了解整体的和,这样才能做 阅读详情

读源码的经历

刚参加工作那会,没想过去读源码,更没想过去改框架的源码;总想着别人的框架应该是完美的、万能的,应该不需要改;另外即使我改了源码,怎么样让我的改动生效了? 项目中引用的不还是没改的jar包吗。回想起来觉得那时候的想法确实挺……

工作了一年多之后准备跳槽了,开始了一轮的面试,其中有几个面试官就问到了相关的源码问题:ArrayList、HashMap的底层实现,spring、mybatis的相关源码。问源码的面试一般就是回去等消息,然后就没然后了。

那时候开始意识到,源码这东西在之前的工作的中感受不到,但是在面试中好像面的还挺频繁的,从此有意识的开始了jdk部分源码的阅读(主要是集合)。一开始看源码,看的特别糙,知道个大概,知道ArrayList的底层实现是数组,HashMap的底层是散列表(数组+链表);更深入一点的扩容、hash碰撞等等就不知道了。

读spring源码起于工作中遇到了一个问题(spring jdbcTemplate事务,各种诡异,包你醍醐灌顶!),排查一段时间最终是解决了,但过程让我非常难受,各种上网查资料、各种尝试,感觉就像大海捞针一样,遥遥无期。我下定决心,我要看一看spring的源码,于是我买了一本《spring源码深度解析》,结合着这本书、打开着eclipse,开始了spring的源码阅读之旅。至此,读源码成了习惯,源码已经进入了我的心里。

后来,springboot的火热,让我也想蹭上一蹭,于是有了springboot的启动源码系列,虽然还在进行中,但是我相信我能将其完成;工作中用到了shiro,我又结合着《跟我学shiro》将shiro的源码看了个大概,有了shiro源码系列博文,还差一篇认证与授权(应该很快就能面世),shiro源码系列就封笔了。最近在搭建自己的后台管理系统,用到了quartz,集成的过程也遇到了一些问题,因此有了quartz的两篇文章。

慢慢的,从一味的网上找资料变成了很多时候会从源码中找答案。不求能读太多的源码,但愿自己接触的技术都能读上一读,路漫漫其修远兮,吾将上下而求索!

我为什么读源码

很多人一定和我一样的感受:源码在工作中有用吗? 用处大吗?很长一段时间内我也有这样的疑问,认为哪些有事没事扯源码的人就是在装,只是为了提高他们的逼格而已。

那为什么我还要读源码呢? 一刚开始为了面试,后来为了解决工作中的问题,再后来就是个人喜好了。说的好听点是有匠人精神;说的委婉点是好奇(底层是怎么实现的);说的不自信点是对黑盒的东西我用的没底,怕用错;说的简单直白点是提升自我价值,为了更高的薪资待遇(这里对真正的技术迷说声抱歉)。

源码中我们可以学到很多东西,学习别人高效的代码书写、学习别人对设计模式的熟练使用、学习别人对整个架构的布局,等等。如果你还能找出其中的不足,那么恭喜你,你要飞升了!会使用固然重要,但知道为什么这么使用同样重要。从模仿中学习,从模仿中创新。

读源码不像围城(外面的人想进来,里面的人想出去),它是外面的人不想进来,里面的人不想出去;当我们跨进城内,你会发现(还是城外好,皮!)城内风光无限,源码的海洋任我们遨游!

我是怎么样读源码的

内容了解

首先我们要对我们的目标有所了解,知道她有什么特点,有些什么功能。对对方都还不了解,就想着进入别人的内心世界,那不是臭不要脸嘛,我们要做一个有着流氓心的绅士;对她有个大致的了解了,就可以发起攻势,一举拿下。

那么怎么样了解了,方式有很多,我这里提供几种,仅供参考

最好的方式就是官方参考指南,亲生父母往往对孩子是最了解的,对孩子的描述也是最详细的;比如Spring Boot Reference Guide就是对springboot最详细的描述,怎么样使用springboot、springboot特性等等,通过此指南,springboot在你面前一览无遗;

但是,springboot毕竟是外国人的孩子,如果英语不好,估计读起来有点头疼了,不过我们有google翻译呀,咬咬牙也是能看的。源码世界的丈母娘、老岳丈是非常慷慨的!

其次是书籍,国外优秀的有很多,国内也不乏好书,比较推荐此方式,自成体系,让我们掌握的知识点不至于太散。这就是好比是源码的闺蜜,对源码非常了解,重点是挺大方,会尽全力帮助我们了解源码。

再次就是博客,虽然可能觉得知识点比较散,但是针对某个知识点却特别的细,对彻底掌握非常有帮助,园子内就有很多技术大牛,写的博客自然也是非常棒,非常具有学习价值。当然还有社区、论坛、github、码云等等。这就是源码的朋友圈,我们从中也能获取到非常多关于源码的信息。
阿里九年架构师教你如何学会阅读源码

设计模式的了解

优秀的框架、技术从不乏设计模式;jdk源码中就应用了很多设计模式,比如IO流中的适配器模式与装饰模式、GUI的观察者模式、集合中的迭代器模式等等;spring源码中也是用到了大量的设计模式。设计模式有什么优点、各适用于什么场景,不是本文的内容,需要我们大家自行去了解。

我们只需要对一些常用的设计模式有个大致了解,再去读源码是比较好的;不需要将23种设计模式都通读,也不需要将常用设计模式完全理解透;对于全部通读,我们时间有限,另外有些模式确实不太好理解、用的少,性价比不高,没必要全部都读。

推荐书籍:《Head First Design Patterns》(中文版:《Head First 设计模式》)、《Java与模式》;

常用设计模式:单例模式、工厂模式、适配器模式、装饰模式、外观模式、代理模式、迭代器模式、观察者模式、命令模式

另外我比较推荐的一种学习设计模式的方式是读别人博客:java_my_life,刘伟技术博客,chenssy的设计模式;

设计模式之于源码,就好比逛街购物之于女人,想顺利勾搭源码,我们需要好好掌握设计模式这个套路。

配合ide进行断点追踪

我们通过源码的圈子对源码的了解终究只是停在表面,终究还是没有走进她的内心,接下来我就和大家分享下,我是如何走进她的内心的!

相信看过我的源码博客的小伙伴都知道,我非常喜欢通过idea断点来进行源码追踪,断点追踪源码是我非常推荐的一种方式。断点不仅可以用来调试我们的代码,也可以用来调试我们用到的框架源码。

面对未知的、茫茫多的源码,我们往往没有足够的时间、经历和耐心去通读所有源码,我们只需要去读我们关注的部分即可(有人可能会说我都不关心,这…)。那为什么要用断掉调试的方式来跟源码,而不是直接从源代码入手去跟我们关注的部分呢?

尝试过的小伙伴应该知道,如果我们对源码不熟悉,直接通过源码的方式去跟,一方面很容易迷路(多态,会有很多子类实现),不知道接下来跟哪一个,另一方面也很容易跟丢,当我们跟入的很深的时候,很有可能就忘记上一步跟到哪了。

下面我会举例来说明我是如何进行断点追踪的,以spring-boot-2.0.3之quartz集成,不是你想的那样哦!和 spring-boot-2.0.3之quartz集成,数据源问题,源码探究 为背景来讲,需要搞清楚两个点:springboot是如何向quartz注入数据源的,quartz是如何操作数据库的

springboot向quartz注入数据源

QuartzAutoConfiguration是springboot自动配置quartz的入口

阿里九年架构师教你如何学会阅读源码

将quartz的配置属性设置给SchedulerFactoryBean;将数据源设置给SchedulerFactoryBean:如果有@QuartzDataSource修饰的数据源,则将@QuartzDataSource修饰的数据源设置给SchedulerFactoryBean,否则将应用的数据源(druid数据源)设置给SchedulerFactoryBean,显然我们的应用中没有@QuartzDataSource修饰的数据源,那么SchedulerFactoryBean中的数据源就是应用的数据源;将事务管理器设置给SchedulerFactoryBean。SchedulerFactoryBean,负责创建和配置quartz Scheduler,并将其注册到spring容器中。SchedulerFactoryBean实现InitializingBean的afterPropertiesSet方法,里面有可以设置数据源的过程

阿里九年架构师教你如何学会阅读源码

可以看到通过org.quartz.jobStore.dataSource设置的dsName(值为quartzDs)最后会被替换成springTxDataSource.加scheduler实例名(我们的应用中是:springTxDataSource.quartzScheduler)。springboot会注册两个ConnectionProvider给quartz:一个dsName叫springTxDataSource.quartzScheduler,有事务;一个dsName叫springNonTxDataSource.quartzScheduler,没事务。

quartz如何操作数据库

我们通过停止定时任务来跟下quartz对数据库的操作

阿里九年架构师教你如何学会阅读源码

发现quartz用如下方式获取connection

conn = DBConnectionManager.getInstance().getConnection(getDataSource());

那么我们的job中就可以按如下方式操作数据库了

package com.lee.quartz.job;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.utils.DBConnectionManager;
import org.springframework.scheduling.quartz.LocalDataSourceJobStore;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class FetchDataJob extends QuartzJobBean {

    // private String dataSourceName = "quartzDs";                                  // 用此会找不到
    // private String dataSourceName = "springNonTxDataSource.quartzScheduler";     // 不支持事务
    // private String dataSourceName = "springTxDataSource.quartzScheduler";        // 支持事务
    private final String insertSql = "INSERT INTO tbl_sys_user(name, age) VALUES(?,?) ";

    private String schedulerInstanceName = "quartzScheduler";                       // 可通过jobDataMap注入进来

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        String dsName = LocalDataSourceJobStore.NON_TX_DATA_SOURCE_PREFIX
                + schedulerInstanceName;    // 不支持事务
        //String dsName = LocalDataSourceJobStore.TX_DATA_SOURCE_PREFIX + schedulerInstanceName;    // 支持事务
        try {
            Connection connection = DBConnectionManager.getInstance().getConnection(dsName);
            PreparedStatement ps = connection.prepareStatement(insertSql);
            ps.setString(1, "张三");
            ps.setInt(2, 25);
            ps.executeUpdate();

            ps.close();
            connection.close();             // 将连接归还给连接池
            System.out.println("插入成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void setSchedulerInstanceName(String schedulerInstanceName) {
        this.schedulerInstanceName = schedulerInstanceName;
    }
}

明确我们的目的,找到合适的切入点,进入断点调试追踪也就容易了。

任我说的天花乱坠,你仍无动于衷,那也只是我一厢情愿,只有局中人才能体会到其中的奥妙!

总结与感悟

从上至下全部通读的方式,个人不太推荐,这是建立在很熟悉的基础上的,当我们对某个框架已经比较熟悉了,再从上至下进行通读,彻底了解,这是我认为正确的方式;但是从不熟悉到熟悉这个过程,个人不推荐全部通读,而是推荐上面我推荐的方式 - 断点局部追踪。

很多时候,我们的博文都只是授之以鱼,而我们也只是从中得到鱼;而这篇的目的则是授之以渔,我希望大家从中学到捕鱼的方法,而不是一味的等待别人的鱼;希望大家能够自给自足,也能把鱼和渔都授予其他人。

只要我们开始去读源码,慢慢的就会形成自己的一套读源码的方式;每个人的方式都不一样,合适自己的才是最好的。行动起来,用合适的方式去俘获你的的她吧!

纯属个人之拙见,不喜请喷!

MyBatisCN:《通用通用阅读指导书——MyBatis源码详解》配套注释版 最新Mybatis的原始码注解版,源码来自 。 该项目对MyBatis中的20包中300多个类进行了注释。注释包括核心方法与核心语句,如下图所示。 本项目是《通用源码阅读指导书——MyBatis源码详解》的配套开源项目。 《通用源码阅读指导书——MyBatis源码详解》以MyBatis源码中的包为单位,详细和透彻地介绍每个类的源码,包括其背景知识,组织方式,逻辑结构,实现细节。在本书的在阅读MyBatis源码的过程中,本书使用了运行初探,模块归类,合理猜测,类比阅读,网格阅读等多种原始码阅读方法,逐步这些原始码阅读方法进行了进一步的总结整理。 本书适合架构师,程序员提升自己的源码阅读能力,系统架构能力,软件开发能力,也有助于产品经理,测试人员,运维人员等从业者了解软件架构细节。 书籍购买地址: | 书籍购买地址: | 书籍目录: 前言 【模块一】背景介绍 1原始阅读 1.1原始阅读的意义 立即下载

相关推荐

facebook协议

支持同时登录多个Facebook账号,按照关键词采集小组地址,群发小组,批量添加推荐人,群发推 荐人消息,采集个人Facebook用户,群发用户私信,群发主页评论。通过客服台管理功能,和粉丝互动聊天,通过话术快捷回复,自动翻译聊天记录。通过FaceBook小组采集小组成员id,或者通过FaceBook个人主页,采集主页上粉丝批量操作已FaceBook账号添加推荐热,可以指定添加某个国家的推荐人,可以设置每个账号添加推荐人个数去重模式:所有的FaceBook账号不添加重复的推荐人。

2503_90751938的博客 965

JAVA要不要看源码_java需要看源码吗

看源码是可以帮助你以后写代码的。如果你是刚开始学,就没有必要看那些东西。但是你要是有能力的话,看看还是很有帮助的,诸如Arraylist,Linkedlist等,等你学习到了,最好还是看看,可以加深你对他们的理解。有选择的阅读代码可以提高自己的编程能力,从别人那里学到一些编程的好习惯和方法是最好的了。1、看源码的目的很大程度上影响了看源码的方式、需要阅读的代码的范围。比如说,如果是为了修一个线上b...

weixin_34688479的博客 2356

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1562

MyBatis12-《通用源码指导书:MyBatis源码详解》笔记-session、plugin包

session包是整个 MyBatis应用的对外接口包,是离用户最近的包。SqlSessionFactory类、SqlSession类都是session包中的类,通过这些类就可以触发 MyBatis对数据库展开操作。

d495435207的博客 322

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 280

实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用

本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。

purple的博客 931

阅读app中数据源的思考。

问题, 如何在读取一行文字后,排版后确定在整个文件的位置? 需求,往前一行,往后一行,排版到什么位置,数据源同步到位置。 方法一, 在getnextline中加上上次跳转的位置,本地必须记录上次读取多少字节,  问题在于若传给排版引擎的文字没派完,就要回传给源, 方法二,使用监听者模式, 排版多少文字,就相应的传给资源,这样就排到那是那。

192

矢量网络分析仪校准:原理、方法与系统适配性

矢量网络分析仪(VNA)校准是射频测量的关键环节,通过误差建模(12项误差项)和标准件测量,可将系统不确定度从±5dB降至±0.1dB以下。主流校准方法包括SOLT(适用于同轴系统)和TRL(适用于波导系统),二者在标准件、误差重点及频率上限等方面存在显著差异。随着6G与量子通信的发展,动态实时校准将成为新趋势。工程师需根据传输结构、频率范围及精度需求选择合适方法,确保测量精度。

u014344410的博客 263

读java源码的好处

结合自己读源码的体会,大概有以下几点好处:1.深入理解java语言。很多人做java开发,只知道怎么用,大概了解语法,但并不是很懂为什么要这么写,这样的后果就是模仿别人的代码,不能根据项目中的实际情况,写出高质量的代码。而当你阅读了java源码之后,你就会发现其实还可以有更高效的方法来解决问题。2.深入体会设计模式。当你深入java源码的时候,你会发现里面用到了很多设计模式,从而加深了自己在实际的...

guotufu的博客 3481

块存储:AIO的直接写流程注释

提交io流程中aio_write之前函数的注释,可参考“块存储:AIO的直接读流程注释”。

yiyeguzhou100的专栏 1335

Android oom_adj 更新原理(一)

通过之前的两篇博文《lmkd 机制详解》和《lmkd中adj score的算法剖析》中,根据计算出来的 min_score_adj 选择大于该值的 oom_adj 的进程进行 kill 处理。oom_adj 随着应用状态的不同其值也是伴随着变化的。本文将通过源码剖析 oom_adj 更新的原理。

私房菜 2656

阿里九年架构师教你如何学会阅读源码,PDF超过6000页

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

2401_84102892的博客 423

AgentScope Java 2.0 项目实战:使用AgentScope Builder 构建企业级多租户 AI Agent 平台

本文基于 AgentScope Builder 源码深度分析,系统讲解多租户 AI Agent 构建平台的完整开发流程。涵盖 Spring Boot 3.x + WebFlux 后端架构、React 18 + TypeScript 前端实现、HarnessAgent 运行时、CompositeFilesystem 多租户隔离、SSE 流式对话、6 种 IM 渠道接入(钉钉/飞书/企微/GitHub/GitLab)、Git 与 Nacos 技能市场、JWT 认证、Docker Sandbox 隔离等核心技术。

program哲学 730

2024年Go最新如何阅读源码汇总,设计思想解读开源框架

本文主要介绍了为什么读源码以及如何读源码,供大家参考,每个人都有适合自己的阅读源码的方式,希望可以在学习中去摸索出一套属于自己的方式。阅读源码不是一蹴而就的,这是持久战,只要你能够坚持下来,肯定受益匪浅。阅读源码的过程比较枯燥,可以在社群里一起讨论学习,这样可能效率更高些。写得不好的或者大家有什么更好的建议,也欢迎留言讨论。最好的关系就是互相成就,大家的在看、转发、留言三连就是我创作的最大动力。参考《Java并发编程之美》《程序员修炼之道:程序设计入门30讲》

2401_84925977的博客 1165

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

read阅读书源集合:重塑你的数字阅读体验

还在为找不到心仪的小说而烦恼吗?🤔 每天在各大阅读平台间切换,只为寻找那本让你欲罢不能的好书?read阅读书源集合项目正是为解决这一痛点而生,它汇聚了上万精选书源,让你轻松拥有专属的移动图书馆! ## 📚 为什么你需要这个书源集合? **告别书荒困扰** - 拥有12433个阅读源,其中7372个经过验证的有效书源,覆盖玄幻、都市、言情、科幻等所有主流文学品类。无论你是资深书虫还是刚入门的

gitblog_00787的博客 1294

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

公开!阿里甩出“源码阅读指南”,原来源码才是最经典的学习范例

我们为啥要阅读源码? 为什么面试要问源码?为什么我们Java程序员要去看源码?相信大多数程序员看到源码第一感觉都是:枯燥无味,费力不讨好!要不是为了“涨薪”我才不去看这个鬼东西!但其实真要把源码这东西搞定你得到的东西远比你想象的要多! 搞定了源码你就能: 方便调试bug 方便扩展,为所欲为(Spring是一个框架,同时是一个生态,作为整个生态的基础支撑,最重要的是扩展性) 方便做二次开发或者自己项目接口开发 提升内功,学习别人的设计思想(源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设

Java圈全能架构师的博客 505

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

阿里一线架构师甩出“源码阅读指南”,从源码到实战,一键搞定

https://maimai.cn/article/detail?fid=1587372468&efid=1SA_t1Kq--HUZDNbtBh5sA

bieber007的博客 229

Java源码阅读的真实体会

刚才在论坛不经意间,看到有关源码阅读的[url=http://www.iteye.com/topic/854647]帖子[/url]。回想自己前几年,阅读源码那种兴奋和成就感([url=http://www.iteye.com/topic/80532]1[/url]),不禁又有一种激动。 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。 说到技术基础,我打个比方吧,如果你从来没...

zwchen的专栏 3033

为什么开源的代码没有注释_为什么要看源码、如何看源码,高手进阶必看

作者:xybaby由于项目的需求,最近花了较多的时间来看开源项目的代码,在本文中,简单总结一下对为什么要看源码、如何看源码这两个问题的思考。看源码的意义看源码只是一种方法、手段,而不是目的。我也曾经给自己制定过“阅读xxx源码”的目标,现在看起来真的很蠢,一点不smart(specific、measurable、attainable、relevant、time-bound)。只有搞清楚了阅读代码的...

weixin_39780784的博客 832

怎么看java源代码

妈的,开发快7年了,源代码一致不知道怎么看,由于自己不是计算机专业的, 必要后只是简单的java培训了下,没有很好的编程功底,导致遇到很多问题,没有找到正确的处理方式,也怪自己懒,3天打网两天晒鱼,自己就是那种遇到问题,解决了事的那种人,当然以前工作的确也太忙了,外包项目一直做,知道的挺多了,但是都不精,本着完成任务了事的态度,没有积累;看源代码基本上就是使用crtl+t找进入jar包看下,但是如

feiduxin的博客 8万+

在Java路上,我看过的一些书、源码和框架(转)

原文地址:http://www.jianshu.com/p/4a41ee88bd82 物有本末,事有终始,知所先后,则近道矣 面试经历 关于Java面试,你应该准备这些知识点关于Java面试,你应该准备这些知识点(续) 前段时间抽空整理了上面两篇面试经历,收到不少的关注,很多同学私信我平时都是如何get到这些知识的,是否有一些相关的书单,Java的源码太多了,应该如何看,框架的代码应该如何阅读等...

weixin_33725270的博客 303
上一篇: 使用Keycloak实现安全的SpringBoot微服务
下一篇: Java学到什么程度才能叫精通?
大G哥
博客等级 码龄9年 5303粉丝 1408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值