Spring源碼解析——如何閱讀源碼

  最近沒什么實質性的工作,正好有點時間,就想學學別人的代碼。也看過一點源碼,算是有了點閱讀的經驗,于是下定決心看下spring這種大型的項目的源碼,學學它的設計思想。

  手碼不易,轉載請注明:xingoo

  這篇博文你可以了解到:

  1 Spring jar包以及源碼使用

  2 簡單的spring運行示例

  3 利用斷點調試程序,如何快速的閱讀程序【快捷鍵等的使用】

  這次閱讀的源碼比較老了,是3.0.5版本的,由于正好手頭有這個版本的源碼,而且平時基本上也是用的這個版本Spring,因此后文的分析也都是針對這個版本。

  下面貢獻一下Jar包以及源碼,由于百度云上傳的壓縮包總是解壓失敗,就放在csdn上面了。

回到頂部

  下面看一下如何使用jar包以及源碼的source包

  首先,在工程右鍵,屬性中,添加必要的jar包。

  選中必要的jar包,上面給出的源碼jar包中,導入spring3.0.5中的所有jar包。

  其中lib內的是spring的jar包,用到哪個導入哪個,不知道的話,全部導入就行了。

  外面的幾個jar包,用于日志以及mysql的驅動。commons-logging jar包是必須的,其他的隨意吧。

  不確定的話,lib外面的這幾個jar包以及lib里面的都導入就行了。

  導入jar包后,點開jar包,選中source attachment進行編輯,鏈接到源碼的jar包。

  選擇相應的source源碼包

  全部導入后,如下

?

回到頂部

  下面給出一個簡單的spring樣例

  首先是一個必要的POJO類,用于注入屬性的值。

復制代碼
 1 package com.test.bean;
 2 
 3 public class Person {  4  5 private String name;  6 private int age;  7  8 public String getName() {  9 return name; 10  } 11 public void setName(String name) { 12 this.name = name; 13  } 14 public int getAge() { 15 return age; 16  } 17 public void setAge(int age) { 18 this.age = age; 19  } 20 public void info(){ 21 System.out.println("name:"+getName()+" age:"+getAge()); 22  } 23 }
復制代碼

  主函數,用于讀取資源文件,獲取bean,調用info方法

復制代碼
 1 package testSpring;
 2 
 3 import org.springframework.context.ApplicationContext;  4 import org.springframework.context.support.ClassPathXmlApplicationContext;  5  6 import com.test.bean.Person;  7  8 public class test {  9 public static void main(String[] args){ 10 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//讀取bean.xml中的內容 11 Person p = ctx.getBean("person",Person.class);//創建bean的引用對象 12  p.info(); 13  } 14 }
復制代碼

  bean.xml用于配置bean的資源文件

復制代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  3  xmlns="http://www.springframework.org/schema/beans"  4  xsi:schemaLocation="http://www.springframework.org/schema/beans  5  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  6 <bean id="person" class="com.test.bean.Person">  7 <property name="name" value="xingoo"/>  8 <property name="age" value="12"/>  9 </bean> 10 </beans>
復制代碼

  運行結果

?

回到頂部

  如何閱讀源碼

  首先,有了前面的jar包以及源碼包,你就可以通過這個簡單的程序,進行但不的調試,閱讀源碼。

  簡單的說下調試的快捷鍵:

  1 F5:下一步,可以進入下一個函數棧

  2 F6:當前函數的下一步,不會進入其他的函數。

  3 F8:下一個斷點。

  4 也可以通過選中一個變量或者表達式,按ctrl+shift+i 來查看內容。或者添加監視的方式,查看。

  5 可以通過快捷鍵F2,來查看一個函數方法的javadoc,即說明

  6 快捷鍵F3或者ctrl+鼠標點擊,進入一個函數

  7 ctrl+shift+G 查看當前方法都有誰在使用

  8 F4查看類的繼承關系,可以向上顯示出類繼承的父類以及接口。

  有了調試的方法,接下來,就是如何閱讀源碼了!

  1 參考書籍,推薦《Spring技術內幕》

  這本書,基本上很詳細的講述了,spring的實現方式,以及類之間的復雜關系。可以幫助你快速的理清復雜的類之間的關系。

  2 使用StarUML畫類圖

  比如你好不容易理清了一個部分的關系,很快就會忘記其中的關系,那么可以通過這個工具,簡單的畫出其中的復雜關系。

  這樣,下一次看的時候也會清楚一些,這是我今天剛畫好的ClassPathXmlApplicationContext的類圖關系:

  

轉載于:https://www.cnblogs.com/jianmang/articles/4915936.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458724.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++多線程編程

一直對多線程編程這一塊很陌生&#xff0c;決定花一點時間整理一下。 os:ubuntu 10.04 c 1.最基礎&#xff0c;進程同時創建5個線程&#xff0c;各自調用同一個函數 [html] view plaincopy #include <iostream> #include <pthread.h> //多線程相關操作頭文件&am…

ajax當頁post請求,tag落地頁--通過ajax-post請求數據

查詢所有tag及其對應跳轉鏈接$tags get_tags(array(get>all));$output . ;if($tags) {foreach ($tags as $tag):$output . . $tag->name .;endforeach;} else {_e(No tags created., text-domain);}$output . ;echo $output;交互tag查詢image場景如下&#xff0c;通過頁…

GIT的PUSH指令

### GIT的PUSH指令 $ git push <遠程主機名> <本地分支名>:<遠程分支名> * git push命令用于將本地分支的更新&#xff0c;推送到遠程主機。 * 如果省略遠程分支名&#xff0c;則表示將本地分支推送到與之對應的遠程分支&#xff08;通常兩者同名&#xff…

Android 編程下 Touch 事件的分發和消費機制

Android 中與 Touch 事件相關的方法包括&#xff1a;dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev)&#xff1b;能夠響應這些方法的控件包括&#xff1a;ViewGroup、View、Activity。方法與控件的對應關系如下表所…

ios微信本地視頻上傳到服務器,ios本地視頻wx.uploadFile上傳

//上傳視頻uploadVideo:function(){let _this this;let list [camera, album];wx.showActionSheet({itemList: [拍攝視頻,從相冊選擇視頻,從視頻庫選擇視頻],success: function (res) {if(res.tapIndex0 || res.tapIndex1){wx.chooseVideo({sourceType:[list[res.tapIndex]],…

如何手工抓取dump文件及分析

在生產環境下進行故障診斷時&#xff0c;為了不終止正在運行的服務或應用程序&#xff0c;有兩種方式可以對正在運行的服務或應用程序的進程進行分析和調試。 首先一種比較直觀簡潔的方式就是用WinDbg等調試器直接attach到需要調試的進程&#xff0c;調試完畢之后再detach即可。…

Java 類加載機制詳解

2019獨角獸企業重金招聘Python工程師標準>>> 一、類加載器 類加載器&#xff08;ClassLoader&#xff09;&#xff0c;顧名思義&#xff0c;即加載類的東西。在我們使用一個類之前&#xff0c;JVM需要先將該類的字節碼文件&#xff08;.class文件&#xff09;從磁盤…

JAVA vo pojo javabean dto區別

JavaBean 是一種JAVA語言寫成的可重用組件。為寫成JavaBean&#xff0c;類必須是具體的和公共的&#xff0c;并且具有無參數的構造器。JavaBean 通過提供符合一致性設計模式的公共方法將內部域暴露成員屬性。眾所周知&#xff0c;屬性名稱符合這種模式&#xff0c;其他Java 類可…

編寫的windows程序,崩潰時產生crash dump文件的辦法

一、引言 dump文件是C程序發生異常時&#xff0c;保存當時程序運行狀態的文件&#xff0c;是調試異常程序重要的方法&#xff0c;所以程序崩潰時&#xff0c;除了日志文件&#xff0c;dump文件便成了我們查找錯誤的最后一根救命的稻草。windows程序產生dump文件和linux程序產生…

Nginx+PHP實時生成不同尺寸圖片

原來圖片服務器采用Windows .net架構&#xff0c;鑒于需求需要生成各種尺寸圖片。流程說明:用戶從Nginx請求對應的圖片,判斷是否存在_200x300的對應參數&#xff0c;如果沒有就直接請求到對應目錄的原圖&#xff0c;否則繼續判斷是否在本地已經生成了對應的緩存圖片&#xff0c…

JavaScript設計模式 Item 2 -- 接口的實現

1、接口概述 1。什么是接口&#xff1f; 接口是提供了一種用以說明一個對象應該具有哪些方法的手段。盡管它可以表明這些方法的語義&#xff0c;但它并不規定這些方法應該如何實現。 2. 接口之利 促進代碼的重用。 接口可以告訴程序員一個類實現了哪些方法&#xff0c;從而幫助…

Spring Boot 樂觀鎖加鎖失敗 - 集成AOP

Spring Boot with AOP 手頭上的項目使用了Spring Boot&#xff0c; 在高并發的情況下&#xff0c;經常出現樂觀鎖加鎖失敗的情況&#xff08;OptimisticLockingFailureException&#xff0c;同一時間有多個線程在更新同一條數據&#xff09;。為了減少直接向服務使用者直接返回…

掌握VS2010調試 -- 入門指南

1 導言 在軟件開發周期中&#xff0c;測試和修正缺陷&#xff08;defect&#xff0c;defect與bug的區別&#xff1a;Bug是缺陷的一種表現形式&#xff0c;而一個缺陷是可以引起多種Bug的&#xff09;的時間遠多于寫代碼的時間。通常&#xff0c;debug是指發現缺陷并改正的過程。…

151031

create or replace procedure pr_test1 is v_case number(3): 100; beginif 2>1 thendbms_output.put_line(成立);elsif 4>3 thenif 7>6 thendbms_output.put_line(不成立);end if; elsif 6>5 thendbms_output.put_line(也行);elsedbms_output.put_line(也不成立);…

postgresql9.5 run 文件linux安裝后配置成開機服務

網上出現的比較多安裝方法要么是源碼安裝&#xff0c;要么是yum安裝&#xff0c;我發覺都要配置很多屬性&#xff0c;比較麻煩&#xff0c;所以現在我在centos7長用 run文件來安裝 http://get.enterprisedb.com/postgresql/postgresql-9.5.1-1-linux-x64.run 這里的安裝shell整…

Windows API GetProcAddress 及demo code

GetProcAddress函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。 函數原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模塊句柄 LPCSTR lpProcName// 函數名 ); 參數&#xff1a; hModule [in] 包含此函數的DLL模塊的句柄。LoadLibrary、AfxLoadLibrary …

【操作系統】進程管理

進程管理 進程的基本概念 程序的順序執行及其特征 程序的順序執行:僅當前一操作(程序段)執行完后&#xff0c;才能執行后續操作。 程序順序執行時的特征&#xff1a;順序性&#xff0c;封閉性&#xff0c;可再見性。 前趨圖 前趨圖(Precedence Graph)是一個有向無循環圖&#…

va_list va_start va_end的使用

<pre name"code" class"cpp" style"color: rgb(51, 51, 51); white-space: pre-wrap; word-wrap: break-word;"><strong>一、 從printf()開始</strong> 從大家都很熟悉的格式化字符串函數開始介紹可變參數函數。 原型&#xf…

Linux學習之CentOS(三)----將Cent0S 7的網卡名稱eno16777736改為eth0

【正文】 Linux系統版本&#xff1a;CentOS_7&#xff08;64位&#xff09; 一、前言&#xff1a; 今天又從Centos 6.5裝回了Centos 7&#xff0c;畢竟還是要順應潮流嘛。安裝完成之后&#xff0c;發現發現CentOS 7默認的網卡名稱是eno16777736&#xff0c;如圖所示&#xff1a…

本地音頻播放,使用AVFoundation.framework中的AVAudioPlayer來實現

本地音頻播放,使用AVfoundation.framework中的AVAudioPlayer來實現 /*AVAudioPlayer的使用比較簡單: 1、初始化AVAudioPlayer對象&#xff0c;此時通常指定本地文件路徑 2、設置播放器屬性&#xff0c;例如重復次數、音量大小等 3、調用play方法播放。 */