最近一位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,歡迎你們進羣和我一塊兒交流。