问了工作5年的Java程序员,为什么要阅读底层源码呢?
最近一位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服务熔断,降级,限流实战