您好,登錄后才能下訂單哦!
本篇內容主要講解“如何構建Spring源碼運行環境”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何構建Spring源碼運行環境”吧!
自己研究源碼的初心就是想看看那些牛逼的框架到底是有多牛逼,代碼到底有多優雅,怎么利用設計模式去構建程序,如何漂亮實現解耦,如何設計擴展點靈活讓第三方開發者干預框架的運行,如何與框架進行整合。說出來可能有人還不信,個人并不是因為想去BAT這些大廠而研究源碼,估計像我這個年齡別人也不會要了。。。自嘲一下!
希望自己通過閱讀Spring源碼提高如下能力:
1.首先肯定是閱讀源代碼的能力,找到閱讀源碼的基本方法,提高DEBUG的能力,加強如何定位問題的技巧
2.讓自己心里的大象邁出一小步,讓自己熟悉閱讀源碼,培養習慣,以后看更多的源碼
3.從源碼中找到寫出漂亮代碼的底層邏輯,比如設計模式、如何解耦、優雅的語法或者API、非常棒的工具類
4.提高項目腳手架質量,提升編碼能力,加快BUG定位速度
5.將閱讀源碼的結果分享出來,盡量可以讓路過的人可以產生閱讀源碼的興趣,解決工作中遇到問題
最新的Spring源碼是通過Gradle構建的,因此只接觸過Maven構建的朋友建議花幾個小時在網上找一個Gradle的學習視頻,大概了解一下grovvy和Gradle相關知識,不然真的看不懂gradle.build文件。比如閉包、Gradle特有的API等,還有Gradle的安裝、IDEA如何提升Gradle編譯速度等。
基于自己的環境寫了一篇博客:https://my.oschina.net/u/3049601/blog/3113019 歡迎參考
1.簡單學習grovvy和Gradle相關知識
2.了解一下設計模式,比如裝飾者、模板方法、工廠方法,還有抽象類、接口的運用,里面用了大量的設計模式,不提前了解一下,代碼看起來比較吃力
3.學習Java8的Lamda表達式
4.學習Idea的快捷鍵,DEBUG的一些技巧
等Spring源碼構建完成后,該如何著手去看喃,當然是寫一個工程,通過DEBUG Spring源碼看執行過程等,總結自己看源碼幾點經驗
1.一定要從GIT上下載源碼并構建,反編譯看源碼,特別是復雜的代碼會發蒙的。
2.在工程中開啟新的工程或者module,引用項目中的module進行調試
3.看源碼之前一定要對框架的使用比較熟悉,千萬不要對框架的使用都不熟悉就跑去看源碼,那樣一定會發蒙的。所以花點錢買點框架使用的書或者視頻先看看,不要吝嗇那幾分錢,等你看完工資一定會漲的。比如SpringMVC,你就只知道加@Controller @Service @Component完成業務代碼可不行。
4.看源碼時通過DEBUG對框架有總體上的認識,不要一來就往深、細了摳,如果那樣的話,你會發現自己很快就看不下去了
5.DEBUG時著重先關注每行代碼執行完后關鍵變量的變化,比如Spring源碼當中的beanDefinitionMap singletonObjects beanPostProcessors等,返回的對象或者值是不是可能你需要關注的
6.善用DEBUG的條件斷點,否則可能你按了無數次F6也到不了你關注的觸發點或者執行點
7.一定要邊看邊加注釋、做筆記、畫圖什么的,因為一兩天你是看不完的,很可能因為其他事情耽擱了,等下次來看又蒙了
8.GOOGLE 百度是常用工具,也可以試著搜索一下gitee或者github上面是否已經有別人看過的源碼分析的項目,DOWN下來接著看,可以提高閱讀速度,但是一定要寫代碼去驗證,因為有人直接翻譯的英文,也許那并沒有什么Luan用。既然是看源碼,是基本的東西,凡是別人的東西一定要多方面驗證才能吸收成正確的自己的,否則看了半天結果是錯的就麻煩了。我就遇到了這樣的問題,在搜索引擎上找到的內容其實在Spring5已經變了。
開始王婆賣瓜。。。。因為現在開發都是基于注解的,因此也是拿AnnotationConfigApplicationContext作為分析對象
非常概要的圖描述Spring容器初始化過程
核心類起的作用就好像汽車的發動機,沒它都跑不了咯,還能指望它帶你去撩妹、看帥哥么。同樣,Spring的核心類能夠保證容器或者叫上下文能夠正常工作,基于它管理我們的業務對象,實現業務邏輯,比如:
AnnotationConfigApplicationContext:也就是Spring的整個容器,Spring還有另外一個類似的叫ClassPathXmlApplicatonContext(基于XML配置的),在它里面包含了所有實例化的單例Bean、系統參數與配置文件加載后的鍵值對、后置處理器、每個Bean的定義等等
AnnotatedBeanDefinitionReader:負責讀取被注解修飾了的Bean的定義,并添加到某一個Bean定義的集合當中。典型的場景就是我的ImportResourceAppConfig.class傳入到AnnotatedBeanDefinitionReader.register()方法中,在BeanDefinitionMap中會新增一個對應的元素。
DefaultListableBeanFactory:這個就相當相當重要了。。。它包含了注冊BeanDefinition-registerBeanDefinition(),然后利用BeanDefinition獲取或者創建Bean的邏輯-getBean(),對應的就有兩個方法常使用的四個變量:
private final Map<String, BeanDefinition> beanDefinitionMap;--存放所有的Spring Bean定義(BeanDefinition),關于BeanDefinition詳解查看:https://my.oschina.net/u/3049601/blog/3127635
private final Map<String, Object> singletonObjects --存放所有的單例Spring Bean
private final Map<String, Object> earlySingletonObjects --存放循環依賴時需要提前被暴露的Bean,這些Bean并沒有被很多PostProcessor(中文翻譯為后置處理器)處理,以解決循環依賴不會出現無限制的遞歸(這里沒明白沒關系,知道它和解決循環依賴有很重要關系即可,后面會詳細說明)
private final Set<String> singletonsCurrentlyInCreation --存放當前容器中正在被創建的beanName(它也和循環依賴有很大關系)
圖中的就是Bean定義集合的元素截圖,這些組件會完成@ComponentScan注解的包掃描,以及被掃描到的類定義注冊,實例化裸對象,完成SpringBean的初始化(包含了各種PostProcessor的處理,比如依賴注入)
圖中截圖Map中Key對應的類如下順序:
ConfigurationClassPostProcessor:掃描@ComponentScan中指定包路徑下所有符合Spring規則的類,如加了@Configuration @Component等的類,將他們的BeanDefinition注冊到beanDefinitionMaps當中。還有另外一個功能就是添加一個ImportAwareBeanPostProcessor,它可以讓你的Bean獲取到將@Import作為元注解時自定義注解的屬性鍵值對(此功能可以先不管)
DefaultEventListenerFactory:和Application Event有關,還沒詳細查看以后再補充
EventListenerMethodProcessor:和Application Event有關,還沒詳細查看以后再補充
AutowiredAnnotationBeanPostProcessor:負責依賴注入和屬性注入,比如@Autowired @Value的相應動作
CommonAnnotationBeanPostProcessor:負責JSR250相關注解的解析與執行,比如@PostContruct @Resource等
使用AnnotatedBeanDefinitionReader.register(ImportResourceAppConfig.class)將ImportResourceAppConfig的BeanDefinition注冊到beanDefinitionMaps當中。完成這個動作之后Spring才能拿到配置類做下一步的包掃描、依賴注入等操作
主要就是ConfigurationClassPostProcessor和AutowiredAnnotationBeanPostProcessor兩個類啟核心作用(當然還有這兩個牽扯出來的其他類),比如ConfigurationClassPostProcessor.ConfigurationClassPaser就是負責完成包掃描的,包含了@ComponentScan @Component @Import @ImportResource @Bean 注解的解析完成所有的BeanDefinition的創建并注冊到beanDefinitionMaps當中
上一步已經將所有的BeanDefinition準備好,接下來就是遍歷他們,使用動態代理完成對象的實例化,并最終得到Spring Bean(可能是裸對象,也可能是代理對象)。
總結:簡單的說Spring并不是直接根據Class文件創建一個Bean,而是生成對應的BeanDefinition對象,再根據它創建想要的Bean,在這個過程當中Spring提供了豐富的擴展點去干預BeanDefinition狀態和Bean的狀態,這些擴展點就是Spring真正強大的原因。
到此,相信大家對“如何構建Spring源碼運行環境”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。