Spring 4.2.5 源碼學(xué)習(xí)(一)

2016-12-08

1.環(huán)境準(zhǔn)備

開發(fā)環(huán)境:Intellij 2016.3
Spring版本:4.2.5

2.創(chuàng)建工程

1.使用Intellij創(chuàng)建個maven工程
2.配置pom.xml文件,引入對Spring的依賴


pom.xml文件配置

3.Spring核心基礎(chǔ)介紹

3.1 Dependency Injection and Inversion of Control---依賴注入和控制反轉(zhuǎn)

首先明確一個觀點(diǎn),依賴注入和控制反轉(zhuǎn)本質(zhì)上所指的是同一件事情,只是從不同的角度來看的時候給出了不同定義。
我們在實現(xiàn)一個功能或某個復(fù)雜的業(yè)務(wù)系統(tǒng)的時候,通常會使用兩個或兩個以上的多個類組合協(xié)調(diào)來實現(xiàn)。如以下代碼所示,A類依賴了C類,當(dāng)我們在構(gòu)建A類的時候,如果沒有IoC容器幫我們實現(xiàn)注入的情況下,通常需要new C(),然后再進(jìn)行A類的構(gòu)建。但是當(dāng)有了Spring的IoC容器后,我們就不需要在關(guān)注于對象的創(chuàng)建和管理了,可以集中精力在業(yè)務(wù)邏輯的實現(xiàn)中。

public class C {

}

public class A {
  private C c;

  public A(C c){this.c = c;}
}

以下內(nèi)容摘自控制反轉(zhuǎn)(IOC)和依賴注入(DI)的區(qū)別,感謝作者的文章。

理解這依賴注入和控制反轉(zhuǎn)這兩個概念,需要搞明白的問題有:

  • 依賴注入和控制反轉(zhuǎn)過程的參與者都有誰?
  • 依賴注入:誰依賴于誰,為什么需要依賴?
  • 依賴注入:誰注入了誰,為什么需要注入?
  • 控制反轉(zhuǎn):誰控制了誰,控制的是什么?
  • 控制反轉(zhuǎn):為什么叫反轉(zhuǎn)?

下面逐一搞明白上面的問題:

  • 依賴注入和控制反轉(zhuǎn)的一般包含了三個方面的參與者,一是對象,二是IoC容器,三是對象依賴的外部資源(包含對象需要的其他對象、或者是對象需要的文件資源等等,例如上面的A類需要C類對象)
  • 對象依賴于IoC容器,需要IoC容器為對象提供依賴的外部資源
  • IoC容器注入了對象,注入的是對象依賴的外部資源
  • IoC容器控制了對象,控制對象實例的創(chuàng)建
  • 反轉(zhuǎn)是相對于正常創(chuàng)建對象的流程來說,如果需要某個對象,我們?nèi)?chuàng)建對象的實例,但是反轉(zhuǎn)來說,對象實例的獲取我們可以直接從IoC容器中獲得

注:
依賴注入
是從應(yīng)用程序的角度描述:應(yīng)用程序依賴容器創(chuàng)建并注入它所需要的外部資源;
控制反轉(zhuǎn)
是從容器的角度描述:容器控制應(yīng)用程序,由容器反向地向應(yīng)用程序注入應(yīng)用程序所需要的外部資源

3.2 Spring IoC容器的實現(xiàn)

IoC容器是一種思想,它在Spring中是什么樣的呢?經(jīng)常使用的BeanFactoryApplicationContext可以看成是容器的具體表現(xiàn)形式。深入Spring的源碼中,可以發(fā)現(xiàn)IoC容器實際上是一系列功能各異的容器產(chǎn)品。BeanFactory接口規(guī)范定義了容易的基本功能。關(guān)于實現(xiàn)該接口的IoC容器類在后續(xù)的源碼閱讀中再進(jìn)行整理和介紹。

Spring BeanFactory接口定義

4 源碼搭建閱讀工程spring-demo

4.1 下載源碼

在第二節(jié)中介紹了在Intellij中創(chuàng)建maven工程后,然后配置pom.xml文件,下載Spring源碼jar包可以在IDE中很方便執(zhí)行。點(diǎn)擊如圖右側(cè)的[maven projects],在Dependencies中選中要下載源碼的jar包,右鍵可以選擇Download Sources.

Intellij maven工程下載Spring源碼

4.2 寫個簡單的POJO類

package com.spring.study.domain;
public class Person {    
  private int age;    
  private String name;    
  public int getAge() {return age;}   
  public void setAge(int age) {this.age = age;}    
  public String getName() {return name;}   
  public void setName(String name) {this.name = name;}                 
  public String toString() {       
     return "[Person], age is :" + age + "; name is :" + name;    
  }
}

4.3 Bean配置文件

創(chuàng)建個bean.xml文件放到resources目錄下。


Bean配置文件

4.4 編寫用于調(diào)試源碼的類

package com.spring.study.domain;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {    
  public static void main(String[] args) {        
    ApplicationContext ctx = new   ClassPathXmlApplicationContext("bean.xml");        
    Person p = ctx.getBean("person", Person.class);        
    System.out.println(p);    
  }
}

4.5 斷點(diǎn)運(yùn)行代碼進(jìn)入Spring的源碼

附張效果圖


Spring源碼調(diào)試閱讀效果圖

4.6 使用Intellij生成UML圖

UML類圖

第一次在簡書寫文章,感謝這么好的平臺。??


參考文章

控制反轉(zhuǎn)(IOC)和依賴注入(DI)的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容