问了工作5年的Java程序员,为什么要阅读底层源码呢?

createh51周前 (12-20)技术教程20

最近一位5年开发经验的群友与我聊天

他说:最近慢慢的尝试去看spring的源码,学习spring,以前都只是会用就行了,但是越是到后面,发现只懂怎么用还不够,在面试的时候经常被问到一些开源框架的源码问题,即使在网上各种百度,当时回答出来也会是很皮毛,不痛不痒的解答。

如果你有认真好好的看《Java编程思想》,你应该能认识到,里面一句深刻的一句话,“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。
读源码三问:“为什么要有这样的架构”,“他是什么样子的”,“他是怎么工作的”。

我们就拿 Spring IOC 举个栗子 首先,来说说,IoC容器。

IoC也称为依赖注?(dependency injection, DI)。它是?个对象定义依赖关系的过程,也就是说,对象只通过构造函数参数、???法的参数或对象实例构造或从???法返回后在对象实例上设置的属性来定义它们所使?的其他对象。然后容器在创建bean时注?这些依赖项。这个过程基本上是bean的逆过程,因此称为控制反转(IoC)

用Java调用一点Spring试试

ApplicationContext ct=new ClassPathXmlApplicationContext("applicationContext01.xml");
ct.getBean("");

来看看啊,ClassPathXmlApplicationContext这是我们用来读文件的,可以读配置的文件的类不计其数,只取一个分析,足矣。

ClassPathXmlApplicationContext这个东西,我们可以追踪他的源头,AbstractXmlApplicationContext、AbstractRefreshableConfigApplicationContext、AbstractRefreshableApplicationContext、AbstractApplicationContext、DefaultResourceLoader、ResourceLoader,哇塞,怎么这么多类啊,要一个个读那不是死人了。因此,我一般只读第一个和最后一个,可以知道它的根基,

public interface ResourceLoader {

String CLASSPATH_URL_PREFIX = "classpath:";

Resource getResource(String var1);

ClassLoader getClassLoader();

}

很明显啊,ResourceLoader 就是干了这么三件事嘛,定义了加载地址,第二,定义了资源加载的方法,第三,定义了类加载器。哦哦,原来如此,ResourceLoader就是IoC的灵魂嘛,负责就是找到资源和加载资源嘛。

好了,那我们来看看,Resource,这个就是定义了资源,然后你们自己看吧。

ClassLoader 你们也自己看吧。

我们来看下一个重要的类吧。那就是getBean()接口提供类。

public interface BeanFactory {
 String FACTORY_BEAN_PREFIX = "&";
 Object getBean(String var1) throws BeansException;
 <T> T getBean(String var1, Class<T> var2) throws BeansException;
 <T> T getBean(Class<T> var1) throws BeansException;
 Object getBean(String var1, Object... var2) throws BeansException;
 <T> T getBean(Class<T> var1, Object... var2) throws BeansException;
 boolean containsBean(String var1);
 boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
 boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
 boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
 Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
 String[] getAliases(String var1);
}

BeanFactory 很明显就是类的工厂。这下子清晰了吧,我们的Resource经过ResourceLoader的调和,用ClassLoader加载,最后变成了BeanFactory。这又是一个粗路线了。

我们想想资源是不是都需要定义和约束,于是有了BeanDefinition,我们需要封装,于是有了各种**wrapper。

我们再来想想细节吧,比如说循环注入问题,A引用B,B引用A,那么怎么吧,那不是循环插入到爆炸?那么Spring是怎么实现的。

我们越想越多,越来越有一种感觉就是,也许那么一刻,那些编程大师,那时候也和你一样这样低头沉思。保持这样的思考,画图,擦涂,重构,最后就是一个能和别人说的架构思想。

那么为什么要阅读源码呢?

随着自身工作年龄的增长或者职称的提高,遇到的问题越来越难,面对企业的高并发,高可用这些问题,已经不能用CRUD 来解决了。回想以前的职业生涯,总结经验,然后把底层知识捡起来,去解决 CRUD 解决不了的难题,才懂得了代码的深层意义。
因此阅读源码框架成为每一位Java开发人员的必修课,而阅读源码则是学习源码底层的最好方式之一。

根据实践统计,工程师实际工作中,阅读代码的时间其实大大超过写代码的时间,这意味着阅读、总结能力,会直接影响我们的工作效率!这东西有没有捷径呢,也许吧,我的心得是:“无他,但手熟尔”


本号专注Java源码分析。喜欢底层源码的朋友可以来交流探讨关注私信回复:555领取Java高级架构资料、Spring源码分析

核心技术

HashMap底层实现与源码分析

Redis/Jedis通讯详解与源码分析

Dubbo RPC通讯原理与源码分析

Zookeeper选举源码分析

RocketMq消息中间件源码详解

Mybatis快速开始

Mybatis工作原理

Mybatis源码分析

Mybatis源码中的设计模式

开发中快速排查bug方式

调试bug的新技能新技巧

Spring源码如何阅读

Spring源码分析

Spring Cloud

Eureka服务注册与发现及其源码分析

Ribbon的负载均衡策略及原理

Fegin 声明式服务调用及其源码分析

Config分布式配置中心详解

Zuul和Gateway 统一网关,服务路由,过滤器使用

Hystrix服务限流,降级,熔断实战

Hystrix实现自定义接口降级,监控数据及监控数据聚合

Sleuth链路跟踪实战

Spring Boot集成Spring Cloud实战

Seata微服务分布式事务解决方案

Nacos注册中心与配置中心详解

Sentinel服务熔断,降级,限流实战

相关文章

volatile很难?由浅入深怼到CPU汇编,彻底搞清楚它的底层原理

Tips:最近面试,但凡是个像样的公司面试官都得问我对volatile关键字理解以及其实现原理。虽然多多少少知道一些,但是问深了,终究感觉还是差了那么一点,所以这次我要把这个关键字来学个通透!本文记录...

Linux从头学:16张结构图,彻底理解「代码重定位」的底层原理

目录程序的结构1. 程序头(Header)的描述信息2. 关于汇编地址bootloader 把程序从硬盘读取到内存1. 读取到内存中的什么位置?2. bootloader 设置数据段基地址3. boo...

一文带你掌握Java框架的底层灵魂:反射 ,框架源码再也不头大了

1.反射是什么Java反射是框架的灵魂,大量框架底层都用到了反射机制,例如Spring....Java反射是在运行状态时,可以构造任何一个类的对象,获取到任意一个对象所属的类信息,以及这个类的成员变量...

直通大厂必考题系列:深入详解Java反射机制与底层实现原理

Java面试的时候经常会被问到Java反射机制,尤其喜欢问:Java反射机制?为什么要用反射机制?Java反射机制的原理?Java反射机制用在什么地方等等?今天主要分享以上内容,详解Java反射机制的...

Volatile的实现原理(看这篇就够了)

谈到并发编程就不得不提到并发三要素:原子性、可见性、有序性,而Volatile就会涉及到可见性与有序性,可见Volatile在并发编程的重要的地位。所以需要重点掌握Volatile,为了助大家掌握好V...

Java 底层大揭秘系列:如何实现定时任务

定时器已经是现代软件中不可缺少的一部分,例如每隔5秒去查询一下状态,是否有新邮件,实现一个闹钟等, Java 中已经有现成的 api 供使用,但是如果你想设计更高效,更精准的定时器任务,就需要了解底层...