最近一位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程序员进阶架构师和面试的资料做了一些整理,免费分享给每一位学习Java的朋友,需要的可以进群:751827870,欢迎大家进群和我一起交流。
本文由博客一文多发平台 OpenWrite 发布!