① 如何利用Eclipse 查看Spring jar 包的源代碼
在Eclipse查看開發包jar源碼的方法如下:
1.選擇項目,右鍵中單擊【Properties】
2.【java Build Path】-【Libraries】,在下面找到如:org.springframework.core-3.1.0.M1.jar包,展開它,選擇【Source attachment】,單擊右邊的【Edit…】按鈕。
3.在打開的窗口中,可選擇文件(jar\zip),目錄或工作空間中的jar文件,在這里我選擇External Folder…,選擇如F:\Development Kit\spring-framework-3.1.0.M1-with-docs\spring-framework-3.1.0.M1\projects即可。
4.連續單擊【OK】兩次回到Eclipse工作平台即可。
我的為什麼不行啊
我【Java Build Path】-【Libraries】找到spring.jar,展開,選擇【Source attachment】,單擊右邊的【Edit…】按鈕,選擇workspace,輸入:/autojboa/WebContent/WEB-INF/lib/spring.jar,最後運行到saveOrUpdate還是進不去,我的/autojboa/WebContent/WEB-INF/lib/spring.jar目錄下有spring.jar
② spring源碼分析
從切入分析源碼,
的類圖,其中繼承了GenericApplicationContext,也繼承了BeanDefinitionRegistry
分析這三個重要的方法
this.scanner = new (this);
實例化了掃面類,但是不是用這個類去掃面要載入的類,那這個類的作用是什麼,是我們手動的掃面,看下面的例子
spring源碼中會自動的掃描包下的類,比如標注了@Component @Configuration等註解的類,自動掃描的時候,會重新有從新new了一個(this);後續的文章會分析,那我們想手動的掃描呢,用的就是這個scanner
主要是讀取配置類這里就是MyConfiguration.class,要注意的是只是將配置類載入到beanDefinitionMap中,不會去解析,通過refresh()方法解析的 ,並注入了很多的BeanFacrotyPostProcessor
this.reader = new AnnotatedBeanDefinitionReader(this);
AnnotationConfigUtils.(this.registry);
最終調用AnnotatedBeanDefinitionReader的有參構造器
方法
構造函數的register(componentClasses);
-->AnnotatedBeanDefinitionReader#register的this.reader.register(componentClasses);
-->AnnotatedBeanDefinitionReader#doRegisterBean
就是最重要的refresh();方法,再後續的文章分析
③ 如何查看spring源碼
1.准備工作:在官網上下載了Spring源代碼之後,導入Eclipse,以方便查詢。
2.打開我們使用Spring的項目工程,找到Web.xml這個網站系統配置文件,在其中找到Spring的初始化信息:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
由配置信息可知,我們開始的入口就這里ContextLoaderListener這個監聽器。
在源代碼中我們找到了這個類,它的定義是:
public class ContextLoaderListener extends ContextLoader
implements ServletContextListener {
…
/**
* Initialize the root web application context.
*/
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
if (this.contextLoader == null) {
this.contextLoader = this;
}
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
...
}
該類繼續了ContextLoader並實現了監聽器,關於Spring的信息載入配置、初始化便是從這里開始了,具體其他閱讀另外寫文章來深入了解。
二、關於IOC和AOP
關於Spring IOC 網上很多相關的文章可以閱讀,那麼我們從中了解到的知識點是什麼?
1)IOC容器和AOP切面依賴注入是Spring是核心。
IOC容器為開發者管理對象之間的依賴關系提供了便利和基礎服務,其中Bean工廠(BeanFactory)和上下文(ApplicationContext)就是IOC的表現形式。BeanFactory是個介面類,只是對容器提供的最基本服務提供了定義,而DefaultListTableBeanFactory、XmlBeanFactory、ApplicationContext等都是具體的實現。
介面:
public interface BeanFactory {
//這里是對工廠Bean的轉義定義,因為如果使用bean的名字檢索IOC容器得到的對象是工廠Bean生成的對象,
//如果需要得到工廠Bean本身,需要使用轉義的名字來向IOC容器檢索
String FACTORY_BEAN_PREFIX = "&";
//這里根據bean的名字,在IOC容器中得到bean實例,這個IOC容器就象一個大的抽象工廠,用戶可以根據名字得到需要的bean
//在Spring中,Bean和普通的JAVA對象不同在於:
//Bean已經包含了我們在Bean定義信息中的依賴關系的處理,同時Bean是已經被放到IOC容器中進行管理了,有它自己的生命周期
Object getBean(String name) throws BeansException;
//這里根據bean的名字和Class類型來得到bean實例,和上面的方法不同在於它會拋出異常:如果根名字取得的bean實例的Class類型和需要的不同的話。
Object getBean(String name, Class requiredType) throws BeansException;
//這里提供對bean的檢索,看看是否在IOC容器有這個名字的bean
boolean containsBean(String name);
//這里根據bean名字得到bean實例,並同時判斷這個bean是不是單件,在配置的時候,默認的Bean被配置成單件形式,如果不需要單件形式,需要用戶在Bean定義信息中標注出來,這樣IOC容器在每次接受到用戶的getBean要求的時候,會生成一個新的Bean返回給客戶使用 - 這就是Prototype形式
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//這里對得到bean實例的Class類型
Class getType(String name) throws NoSuchBeanDefinitionException;
//這里得到bean的別名,如果根據別名檢索,那麼其原名也會被檢索出來
String[] getAliases(String name);
}
實現:
XmlBeanFactory的實現是這樣的:
public class XmlBeanFactory extends DefaultListableBeanFactory {
//這里為容器定義了一個默認使用的bean定義讀取器,在Spring的使用中,Bean定義信息的讀取是容器初始化的一部分,但是在實現上是和容器的注冊以及依賴的注入是分開的,這樣可以使用靈活的 bean定義讀取機制。
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
//這里需要一個Resource類型的Bean定義信息,實際上的定位過程是由Resource的構建過程來完成的。
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
//在初始化函數中使用讀取器來對資源進行讀取,得到bean定義信息。這里完成整個IOC容器對Bean定義信息的載入和注冊過程
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws
BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
④ 想看spring源碼 該怎麼看
1、在你的MyEclipse上安裝一個反編譯插件,這樣,所有的class文件都能看到它的源代碼 2、建議你用jad MyEclipse反編譯插件。 3、要相應jar包,我上傳給你了。
⑤ 如何評價spring源碼深度解析
您好,希望以下回答能幫助您 《SPRING技術內幕——深入解析SPRING架構與設計原理》 該書講了spring的ioc容器原理,在xml的spring配置文件中,對象是如何解析並生成的。 spring的aop,面向切面編程。這兩塊是比較重要的,屬於核心部分。 其他的如spring mvc ,spring jdbc與hibernate,ibatise集成,spring事務,spring security, spring 任務調度都有介紹。 大體來說,屬於跟著代碼走向,一個類一個類介紹了一下。其實代碼都是有英文注釋的。 跟著作都的思路看過來也還是可以的,最好是對照類圖分析。 如您還有疑問可繼續追問。
⑥ 怎麼閱讀Spring源碼
准備工作
1. 安裝github:現在spring源代碼都在github管理,所以首先需要下載githup,下;
2. 安裝gradle構建工具: 下載完後進行解壓到任意盤符,然後增加環境變數GRADLE_HOME,並在環境變數bin中增加%GRADLE_HOME%/bin,打開DOS窗口,運行gradle -v,出現版本號等信息,表示安裝成功;
3. 下載Spring源碼:首先打開git shell,切換到你的工作目錄,然後輸入以下命令:git clone git://github.com/SpringSource/Spring-framework.git,後面一串是源碼下載地址。大概半小時的樣子,就可以下載完成,這時候在你的工作目錄中就會出現Spring-framework的目錄,裡面有Spring各組件的源碼包;
4. 構建導入:下載下來的代碼不能直接導入Eclipse,要先轉換成Eclipse能讀取的形式。因為所有組件都會依賴spring-core,所有我們首先要轉換Spring-core工程,在命令窗口切換到Spring-core工程,運行gradle cleanidea eclipse命令,我們會看到開始下載工程所依賴的jar包,幾分鍾後執行完畢,再來看Spring-core文件夾,多了.classpath、.project等文件,這是Eclipse工程所必須的,然後可以把他導入到eclipse。因為大部分Spring組件都會用到 spring-beans、spring-context、spring-aop,而他們又依賴spring-expression、spring-instrument,所以我們乾脆先把這些工程都進行轉換並導入eclipse。
我初次導入過程並不順利,拿spring-core為例,其中以來的一個jar包是Spring-framework/spring-core/build/libs/spring-asm-repack-4.0.jar,但我工程裡面並沒有他,只好在網上下載了一個,並加入構建路徑,其次我還發現少commons-pool-1.5.3.jar、spring-cglib-repack-3.0.jar,都一一下載,最後還是報錯沒有java.util.concurrent.ForkJoinPool類,發現這個版本必須使用jdk1.7以上,1.6沒有這個包。折騰半天,終於幾個工程沒變異錯誤了,向前邁進了一步。
⑦ 如何閱讀Spring源碼
如果你是一名JAVA開發人員,你一定用過Spring Framework。 作為一款非常經典的開源框架,從2004年發布的1.0版本到現在的5.0版本,已經經歷了16年的洗禮。可以說這是一款老框架了(當然這里的老僅僅指的是時間).
在這16年中,涌現了很多技術,大多曇花一現,但Spring經久不衰。隨著技術的演進與版本的更迭,Spring框架總能不落後於技術的潮流,總能緊跟時代的步伐。
究竟是什麼樣的設計可以讓它經久不衰?究竟它體現了一種什麼樣的設計哲學?
閱讀Spring源碼之前的准備:
熟練使用Spring框架:只有當你熟練了,閱讀其源碼水到渠成
扎實的JAVA基礎:如果你不具備扎實的JAVA基礎,那麼請不要輕易嘗試,否則只是浪費寶貴的時間。那麼怎麼樣才算是基礎扎實呢?此處暫列出一些基本精通的東西,如集合框架(數據結構的實現),多線程技術(線程池、線程安全、並發容器等),反射與註解(Spring中大量的使用到了反射),面向對象(面向對象不僅僅指的是對象抽象,還包括對象集成、多態等各種機制)以及JAVA的一些其他高級特性(如基於java介面的動態代理等)
設計模式:Spring中大量的使用了各種設計模式已提高其健壯性,因此對於設計模式需要一些深刻的理解.
繪制UML能力:在閱讀的時候,肯定是要探究其核心對象之間的關系,而UML類圖不失為一種非常直觀的方式.
激情與毅力:學習一件事物的時候激情是非常重要的,但毅力才是體現成敗的關鍵.
如何開始閱讀:
了解其整體架構與核心概念以便建立Spring的模型
從框架入口開始抽絲剝繭,理解其每一個核心概念以及作用,並將這些核心技術點融匯起來
探究每一個核心的實現細節(UML圖、跑單元測試用例、DEBUG,體悟)
以上,僅為我自己閱讀源碼的方式。
工作中一直得益於Spring帶來的便利,對於Spring的使用應該很是熟練了,但對於它的設計理念與整體架構卻沒有一個非常清晰明了的認知。
很久之前就想過要閱讀Spring的源碼了,但一直是無從下手的狀態。也曾嘗試著debug去強行閱讀, 但不了解的地方甚多。 於是反省自己java的基礎,反省自己閱讀的方式。
經過一段很長時間的查缺補漏, 終於可以順利的去閱讀Spring的源碼了,所以在此處加以記錄。
⑧ 阿里內部都在用的Spring源碼手冊,學會也是阿里人
最近在使用Spring MVC過程中遇到了一些問題,網上搜索不少帖子後雖然找到了答案和解決方法,但這些答案大部分都只是給了結論,並沒有說明具體原因,感覺總是有點不太滿意。
更重要的是這些所謂的結論大多是抄來抄去,基本源自一家,真實性也有待考證。
那作為程序員怎麼能知其所以然呢?
此處請大家內心默讀三遍。
閱讀源碼的魅力在於:
分享一本阿里內部人都在使用的Spring源碼手冊分享給讀者朋友們,學會掌握了本手冊內容,距離成為阿里人也是成功的跨了一大步子。
第一部分:核心實現原理
第二部分:企業應用
⑨ JAVA架構師沒看過spring源碼正常嗎
不正常,
Spring在國內已經是一個龐大的生產級開發框架,作為架構師,特別是Java架構師,一定得了解其相關源碼