1. 程式人生 > >Spring學習筆記(一)---Spring概述

Spring學習筆記(一)---Spring概述

https://blog.csdn.net/sinat_34596644/article/details/53130176

 

一、Spring的定義和作用?

 

  • 定義:用一句比較簡短的話來描述:Spring是一個容器框架,是一個用於配置和管理bean之間的關係的輕量級框架;
  • 作用:控制反轉Ioc(Inversion of Control),面向切面程式設計AOP(Aspect Oriented Programming),現成的可複用元件,便利了與其他框架的整合等。

 

二、Spring在Web應用中作用的層次?

小結:Spring接管了Web應用的各個層次,至於如何配置和管理元件請往下參見Spring提供的Ioc功能。這便體現了容器框架了。

 

三、Spring提供的Ioc功能

 

  • 控制反轉Ioc:控制反轉指的是把傳統上由程式程式碼直接建立和管理物件的職責移交給容器。具體有依賴注入和依賴查詢兩種方式。
  • 示例:有一個Student(name,Teacher)類,一個Teacher(name)類。現在需要建立一個Student物件。我們來比較一下這兩種做法。

 

傳統:

Teacher teacher=new Teacher();

teacher.setName("老師");

Student student=new Student();

student.setName("學生");

student.setTeacher(teacher);
Spring:
<bean id="student" class="test.Student">

<property name="name" value="學生"/>

<property name="teacher" ref="teacher"/>

</bean>


<bean id="teacher" class="test.Teacher">

<property name="name" value="老師"/>

</bean>

分析1:第二種方法中我們配置了一個Student物件和一個Teacher物件,併為其注入了屬性,其中Student的teacher屬性指向了我們定義的Teacher物件。Spring會將這兩個物件管理起來,並且將Teacher物件注入到Student物件中。現在應該稍微能夠理解Spring是配置和管理bean的容器框架了吧?


分析2:那麼Spring煞費苦心為我們做了這事情有什麼作用呢?或者說控制反轉有什麼作用?

寫過稍大一點的程式的人應該很有體會,到了後面,其實程式很不好擴充套件,不好維護。對於企業級應用更是可能出現記憶體管理有關的問題,十分難以排查和維護。這是我們因為程式碼中存在大量的重複工作用來建立具體的實現,與具體耦合了!還以上面的例子為例,現假設Student和Teacher都實現了Person介面

在傳統的方式中,我們假設程式碼中有1000個地方出現了Person  person = new  Student()這個語句,接著呼叫person介面中的方法。有朝一日,我們想要將Student換成Teacher物件?怎麼辦??我們不得不對這1000處都做修改,換成Person  person = new  Teacher(),想想都害怕。那麼假如我們用了Spring呢?那麼我只要在配置檔案中將person物件的實現類替換成Teacher類即可,那麼對於其他依賴於person物件的類,都會得到新的Teacher物件而非Student物件。也就是說,使用Spring可以讓我們方便地替換抽象的具體實現! 這類似於工廠模式。

 

分析3:控制反轉的缺點

一種技術不可能是十全十美的,必定是有所權衡,控制反轉亦是。首先,相比於直接使用new建立物件,使用Spring配置bean物件時底層框架需要使用到反射機制,這必然會帶來一定的效能損耗;其次,假如我們重構的時候修改了類的路徑(改了包名等),那麼必須手動去XML檔案中修改。

 

四、Spring提供的AOP功能

先提一下程式語言的發展歷程,機器語言->組合語言->面向過程的高階語言->面向物件的高階語言。可以看出,這是逐漸抽象和封裝的過程。到了面向物件,已經能夠以物件維度進行程式設計,現在要提到的是更上維度的面向切面程式設計。什麼是切面呢?切面是應用中的交叉功能,也即是多次重複出現的同場景下的功能。比如需要在每次方法呼叫的時候列印日誌,這種情況下假如我們還用面向物件的粒度去思考和程式設計,那麼在每次方法呼叫時必然很累贅,會出現以下重複的模式,這樣系統是難以維護的:

 

public void method(){

//方法呼叫前的日誌列印

// TODO: 2016/11/11 業務邏輯

//方法呼叫後的日誌列印

}

AOP要做的事情就是將這些重複的邏輯抽離出來,怎麼做呢?其實看到上面的場景,很多人就能想到代理模式了,不錯,這正是Spring採用的方法。Spring可以給我們返回代理物件,實際的業務邏輯Spring會交由實際物件處理,方法呼叫前後的其他邏輯程式碼由代理物件執行。這樣就能實現在方法呼叫的前後做一些通用的工作了(比如打日誌,統計方法呼叫時間,事務管理等)。

當然僅有代理模式是不足的!因為Spring還需要知道需要代理的具體方法(你有時候並不是所有的方法都需要列印日誌),這個時候就需要我們幫助Spring選擇了。Spring提供了註解、XML多種方法幫助我們宣告需要被代理的方法。AOP的具體使用後面的文章會提到。

 

五、Spring提供的現成可複用的元件和便利的框架整合

我們可以發現,Web應用基本上都會有一些通用的功能,會有許多相似的程式碼。於是Spring將這些功能封裝起來,只要我們需要,就可以將相應的bean配置到上下文中,那麼這個元件就成為了受Spring容器管理的bean,可以通過其API使用其功能。

除了Spring提供的元件,Spring還人性化地為我們考慮到了更多的可能,允許我們整合一些優秀成熟的框架。以Hibernate為例,我們只要下載其jar包之後,將需要使用到的元件註冊到Spring上下文中,那麼就可以在應用中使用Hibernate的ORM對映功能。