最近一位5年开发经验的群友与我聊天程序员
他说:最近慢慢的尝试去看spring的源码,学习spring,之前都只是会用就好了,可是越是到后面,发现只懂怎么用还不够,在面试的时候常常被问到一些开源框架的源码问题,即便在网上各类百度,当时回答出来也会是很皮毛,不痛不痒的解答。
若是你有认真好好的看《Java编程思想》,你应该能认识到,里面一句深入的一句话,“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。
读源码三问:“为何要有这样的架构”,“他是什么样子的”,“他是怎么工做的”。面试
咱们就拿 Spring IOC 举个栗子 首先,来讲说,IoC容器。spring
IoC也称为依赖注⼊(dependency injection, DI)。它是⼀个对象定义依赖关系的过程,也就是说,对象只经过构造函数参数、⼯⼚⽅法的参数或对象实例构造或从⼯⼚⽅法返回后在对象实例上设置的属性来定义它们所使⽤的其余对象。而后容器在建立bean时注⼊这些依赖项。这个过程基本上是bean的逆过程,所以称为控制反转(IoC)编程
用Java调用一点Spring试试
ApplicationContext ct=new ClassPathXmlApplicationContext("applicationContext01.xml");segmentfault
ct.getBean("");架构
来看看啊,ClassPathXmlApplicationContext这是咱们用来读文件的,能够读配置的文件的类不可胜数,只取一个分析,足矣。并发
ClassPathXmlApplicationContext这个东西,咱们能够追踪他的源头,AbstractXmlApplicationContext、AbstractRefreshableConfigApplicationContext、AbstractRefreshableApplicationContext、AbstractApplicationContext、DefaultResourceLoader、ResourceLoader,哇塞,怎么这么多类啊,要一个个读那不是死人了。所以,我通常只读第一个和最后一个,能够知道它的根基,app
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,欢迎你们进群和我一块儿交流。