Spring源碼閱讀筆記01:源碼閱讀環境准備


1. 寫在前面

  對於做Java開發的同學來說,Spring就像是一條繞不過去的路,但是大多數也只是停留在對Spring的簡單使用層面上,對於其背后的原理所知不多也不願深究,關於這個問題,我在平時的生活及工作中也在不斷思考。

  為什么要閱讀Spring的源碼?

  • 不是為了讀源碼而讀源碼,Spring有很好的設計思想,值得學習;
  • Spring是當前使用最廣泛的一個開發框架,學習其原理可以幫助我們更好的應對工作中出現的各種框架相關的問題;
  • 在開發中越來越多的使用到了各種各樣的框架,漸漸的開發人員只會引入jar包進行開發了,對於一些應用底層的問題難以快速解決,閱讀源碼可以讓我們站在一個更高的視角看待我們的開發的工程,對整個系統也能夠有更深入的了解,有助於增加自己的深度;
  • Spring對很多其它的框架(比如mybatis、springmvc等)提供了很好的集成,學習Spring的原理可以更好的幫助我們理解其他的框架的工作原理,從而對整個系統能夠有更深入的了解;

   以上只是個人觀點,基於此,打算閱讀一下Spring源碼並將相關讀書筆記總結成文,以供后面回顧。所謂磨刀不誤砍柴功,要閱讀源碼,首先我們要有一個源碼閱讀的環境,所以第一篇文章先來總結一下源碼閱讀環境的搭建。

2. 構件源碼閱讀環境

  首先聲明一些基本配置:這個讀書筆記系列中涉及到的開發工具是eclipse,Spring版本為3.2.18.RELEASE,電腦所使用的操作系統為win 10。

  閱讀Spring源碼常用的方式有兩種:

  • 新建一個工程,引入Spring的jar包,然后直接閱讀;
  • 下載Spring官方源碼並導入到工程中,然后進行閱讀;

  前者非常便捷,后者逼格更高,而且可以修改源碼,兩者沒有好壞之分,使用哪種從心即可,這里只是記錄一下在搭建源碼閱讀環境的過程中所踩過的坑。

2.1 引入jar包

  采用這種方式非常方便,只需要在項目中引入Spring相關的依賴,再簡單配置一下,就能閱讀源碼了。筆者在閱讀時是通過maven進行構建工程的,所使用的Spring依賴如下:

   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.2.18.RELEASE</version>
   </dependency>

  這種方式比較簡單,對於想閱讀Spring源碼的同學來說,其簡單使用及配置自然是會的,在此就不過多論述這部分了。

2.2 下載官方源碼並導入工程

  這種方式在我看來就是逼格比較高罷了(可以修改Spring的源碼),但是環境的搭建還是要費一番功夫的,筆者當初在這個地方還是費了一些時間的,特在此記錄當時踩過的坑,廢話有點多,這就開始吧。

  Spring的源碼是托管在github上,所以我們先需要上網把它下下來。首先輸入網址https://github.com/,搜索Spring,本次導入的源碼版本為3.2.x,進行排序按照stars多少來選擇():

   選擇版本:

   點擊下載zip文件:

  下載下來后,解壓縮得到源碼文件:

  此時,對應文件夾下已經存在相應的源碼了,但是這個源碼並不能直接導入Eclipse中,我們還需要將源碼轉換為Eclipse可以讀取的形式。因為源碼下面有很多工程,這里建議只對我們感興趣的工程進行Eclipse工程轉換,比如我們想要查看Spring容器部分源碼,打開cmd命令窗口,將當前目錄切換至源碼所在目錄,這里是Spring-Context文件夾下,執行命令"gradle cleanidea eclipse"(前提得是要安裝了gradle才行,因為Spring的源碼是用gradle構建的),當窗口出現如下狀態說明已經成功了:

  如果提示下面的錯誤:

Could not get unknown property 'classesDir' for main classes of type org.gradle.api.internal.tasks.DefaultSourceSetOutput 

The classesDir property was deprecated in gradle 4.x, and removed in gradle 5.x (see the release notes).

  這是由於gradle的版本過高導致,需要切換到4以下,詳見 Could not get unknow property 'classesDir' for main classes ...

   如果出現如下錯誤:

Could not find matching constructor for: org.gradle.plugins.ide.eclipse.model.ProjectDependency(org.codehaus.groovy.runtime.GStringImpl,java.long.String)

  這也是由於gradle的版本導致,對於的源碼中缺少構造器,詳見:如何從github上拉取Spring-framwork源碼項目,導入到eclipse中

  解決如上問題之后,這時,我們再看對應的文件夾會發現,已經出現了作為Eclipse工程所必須的.project與.classpath文件了,這時就可以打開Eclipse,將工程導入了,導入項目之后相關依賴的項目也需要導入。

  導入之后,項目上有個紅嘆號,右鍵項目--properties--Java Build Path--Libraries,發現是丟失spring-asm-repack和spring-cglib-repack包,安照下面的步驟來處理:

  • 這個網站下載spring的lib壓縮包,我下載的是和源碼對應的spring-framework-3.2.18.RELEASE-dist.zip;
  • 解壓spring-framework-3.2.18.RELEASE-dist.zip 在spring-framework-3.2.18.RELEASE-dist\spring-framework-3.2.18.RELEASE\libs路徑下找到spring-core-3.2.18.RELEASE.jar;
  • 再把spring-core-3.2.18.RELEASE.jar用壓縮工具解壓出來;
  • 然后cmd到這個目錄下執行如下兩條命令:
jar cvf spring-cglib-repack-3.1.jar org\springframework\cglib
jar cvf spring-asm-repack-5.0.4.jar org\springframework\asm

  命令執行成功后會生成如下jar包:

  將這兩個jar包導入項目之后,錯誤就消除了:

  這里我們已經導入core,同樣的操作,我們導入spring-beans,這里就已經具備基本的IoC功能了,我們可以寫點測試代碼試試。

  beans.xml,配置文件需要放在core項目下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

    <bean id="testBean" class="test.TestBean">
        <property name="name" value="hello"></property>
    </bean>
</beans>

  下面是測試用例:

public class Test {
    public static void main(String[] args) {
        /**
         * 用XmlBeanFactory這個方式獲得bean,現在已經不用這個方式了
         */
            XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
            TestBean myTestBean = (TestBean) xmlBeanFactory.getBean("myTestBean");
            System.out.println( myTestBean+ "---"+ myTestBean.getName());
    }
}

public class TestBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  運行結果:

  好啦,如果順利執行到這一步,那就代表你成功了,接下來你就能對Spring為所欲為了。。

3. 遇到問題

  除了上面遇到的問題,還有幾個問題記錄在這里。

  導入spring-context時候遇到問題:Access restriction: The type 'Application' is not API (restriction on required library rt.jar)。 

  解決辦法:右鍵spring-context工程--properties--Libraries--點開JRE--Access Rules--Edit--Add--添加新規則com/sun/net/**,詳見參考文獻4,參考如下:

  我們瞥一眼beans工程中的代碼:

4. 參考文獻

1. eclipse導入spring源碼二(丟失的spring-asm-repack和spring-cglib-repack)
2. Spring源碼下載及安裝
3. Build path entry is missing” error when trying to create a new project in Eclipse
4. Access restriction: The type 'Application' is not API (restriction on required library rt.jar)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM