IDEA閱讀spring源碼並調試

目標:搭建起Spring源碼閱讀和代碼調試跟蹤的環境,順便創建一個簡單的Demo,可以調試Spring的源代碼html

本節,主要介紹一下Spring源碼閱讀和調試的相關環境搭建,並使用MVN建立一個很是簡單的Demo,以即可以跟蹤和調試Spring的內核。git

一、源碼的下載github

Spring的源碼能夠從GitHub上下載:https://github.com/spring-projects/spring-frameworkweb

二、Spring源碼的編譯spring

Spring源碼下載下來後,我這裏比較習慣,先編譯出來,而不是直接導入到相關的 IDE。大型的開源項目都是藉助於自動化構建工具實現編譯打包的,所以先編譯有個好處,就是編譯過程當中,會自動的下載相關的依賴。如今大部分項目編譯過程當中出現的問題,首先都歸結到項目依賴的問題。express

①、編譯環境apache

A、操做系統:個人源碼和相關開發環境,都是在 mac 下的網絡

B、JDK:安裝好JDK1.8app

C、因爲Spring源碼是採用Gradle這種自動化構建工具構建的,所以須要安裝 Gradle ,安裝過程就很少說了。eclipse

D、我使用的IDE是 IntelliJ IDEA,所以,須要安裝 IntelliJ IDEA 旗艦版,免費30天

②、源碼編譯

在源碼編譯環境準備好後,編譯源碼以前,請先仔細看一下 Spring源碼目錄下的 README.md、import-into-idea.md  這兩個文件。 README.md中,告知了整個編譯過程和須要注意的地方。若是你使用Eclipse做爲IDE的開發工具,那直接運行./import-into-eclipse.sh  或者 ./import-into-eclipse.bat ,就能夠把源碼導入到Eclipse中,若是使用IDEA做爲開發工具,那麼須要認真閱讀 import-into-idea.md,它告訴了你導入IDEA的步驟。

A、先進入 …/spring-framework 目錄,執行 ./gradlew :spring-oxm:compileTestJava  先對 Spring-oxm 模塊進行預編譯。

B、仍是在 …/spring-framework 目錄 ,執行 ./gradlew build -x test  編譯,整個Spring的源碼。 後面的 -x test  是編譯期間忽略測試用例,須要加上這個,Spring的測試用例,有些是編譯不過的。編譯過程時間,會隨着網絡的暢通程度而不一樣。

③、源碼導入IDEA

編譯經過後,就能夠把源碼導入到 IDEA中了

在IDEA中 File -> New -> Project from Existing Sources -> Navigate to directory ,選擇Spring源碼目錄,導入,而後IDEA會自動的使用Gradle進行構建。構建完成以後,須要作以下設置:

排除 spring-aspects  項目,這個是Spring 的AOP體系集成了 aspects ,但在IDEA中沒法編譯經過,緣由能夠參見:

http://youtrack.jetbrains.com/issue/IDEA-64446

選中  spring-aspects  項目 右鍵,選擇「Load/Unload Moudules」 在彈出的窗體中進行設置(以下圖所示):

 

 

三、簡單的Demo的搭建

這裏能夠建立一個簡單的Demo,該Demo依賴於Spring的源碼,這樣,就能夠從外部,運行Demo,跟蹤到Spring的內部源碼了。爲不失通常性,這裏的Demo採用MVN進行構建,只不過,相關的Spring的源碼依賴須要在IDEA中設置成本地源碼

①、使用IDEA 在Spring的源碼的Project目錄下,建立一個Demo,能夠直接使用MVN的骨架

 

②、Demo的相關設置和簡單的代碼測試

A、設置一下pom.xml 中的 junit 依賴版本,修改成 4.12 不然Spring的單元測試,編譯不經過

B、在IDEA設置Spring的項目依賴(設置Spring-core、Spring-beans、Spring-context、Spring-expression這幾個module就能夠了):

 

 

C、pom.xml中須要引入commons-logging的依賴,不然編譯報找不到LogginFactory的錯誤.配置靜態資源路徑(不然讀取xml的時候,找不到路徑)

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.hxl</groupId>
<artifactId>spring-debug</artifactId>
<version>1.0-SNAPSHOT</version>

<name>spring-debug</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

<!-- 引入commons-logging依賴 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>

<build>
<!-- 靜態資源路徑配置 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
 

D、設置Spring的配置和編寫簡單的Spring代碼

 

建立一個簡單的 登陸接口 ILogin:

public interface ILogin {
String loginCheck(String userName,String password);
}
 

它有個實現類:

 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class LoginImpl implements ILogin {

String id = "";

@Autowired(required = false)
public void setId(String id) {
this.id = id;
}

@Override
public String loginCheck(String userName, String password) {
System.out.println("boy登陸...");
return "success";
}
}
 

而後,把該bean 註冊到配置中(路徑spring-debug/src/spring-config.xml):

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="loginService" class="com.boy.login.LoginImpl"/>
</beans>
最後,編寫調用的代碼:

import com.boy.login.ILogin;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

/**
* Hello world!
*/
public class App {
public static void main(String[] args) {

// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
String XMLPath = "//Users/sky/Java/spring-framework/spring-debug/src/spring-config.xml";
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(XMLPath);
ILogin login = (ILogin) applicationContext.getBean("loginService");
login.loginCheck("boy", "123");
}
}
 

而後就能夠 進行Debug了,而且能夠Debug到Spring源碼內部。原文:https://blog.csdn.net/u013310075/article/details/80707098

相關文章
相關標籤/搜索