最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中IOC和AOP的深入講解

 更新時間:2018年12月28日 08:42:23   作者:余同學的開發(fā)之路  
這篇文章主要給大家介紹了關于Spring中IOC和AOP的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

Spring是一個開源框架,Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業(yè)應用開發(fā)的復雜性而創(chuàng)建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。 簡單來說,Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。

這篇文章主要講 Spring 中的幾個點,Spring 中的 IOC,AOP,下一篇說說 Spring 中的事務操作,注解和 XML 配置。

Spring 簡介

Spring 是一個開源的輕量級的企業(yè)級框架,其核心是反轉(zhuǎn)控制 (IoC) 和面向切面 (AOP) 的容器框架。我們可以把 Spring 看成是對象的容器,容器中可以包含很多對象,所以 Spring 有很多強大的功能。

一句話,Spring 是項目中對象的管家,負責管理項目中用到的所有對象。所以在項目三層架構中,Spring 不屬于某一特定層。

Spring 的 Hello World

想要構建一個 Spring 的入門程序,我們需要導入 4 個核心包和 2 個輔助包,創(chuàng)建一個實體類,最主要的是編寫核心配置文件,applicationContext.xml 放在 src 下。最后寫一個測試類即可。此時在測試類中我們不需要在使用 new 關鍵字去創(chuàng)建對象了。這也正是 Spring 的作用所在,會自動給我創(chuàng)建對象。

上圖展示的就是最基本的演示,也是很容易就理解了,配置文件中配置了 user 對象,我們通過加載配置文件來獲取對象從而避免了使用 new 來創(chuàng)建。

什么是 IOC

到這里我們就可以解釋一下 Spring 中的核心概念之一的 IOC,即 inverse of control ,翻譯過來就是反轉(zhuǎn)控制。想想我們以前想要一個對象就會主動的 new ?,F(xiàn)在 Spring 會幫我們創(chuàng)建對象,不需要手工 new(但是要記得配置呀)反轉(zhuǎn)說的就是創(chuàng)建對象的方式反轉(zhuǎn)了,以前是我們自己創(chuàng)建對象,現(xiàn)在由 Spring 為我們創(chuàng)建。

控制又是指什么呢?一個對象要有屬性值吧,還有可能存在其它的對象,控制說的就是這些屬性和引用不需要自己寫了,由 Spring 來為我們自動創(chuàng)建(其實還是我們自己配置的~)。

總結(jié)下來就是 Spring 可以自動的為我們創(chuàng)建對象,并注入依賴。而反轉(zhuǎn)控制說的就是以前我們自己創(chuàng)建對象和依賴,現(xiàn)在由程序為我們創(chuàng)建。

Spring 創(chuàng)建對象的方式

那 Spring 又是如何為我們創(chuàng)建的呢?我們知道對象的創(chuàng)建必須要經(jīng)過構造器,從上面的例子中看到,我們只配置了一個<bean>標簽,其實這就是將空參構造器使用配置文件給表示出來罷了。Spring 中創(chuàng)建對象也就是這么簡單,當然配置可以更復雜些,后面再說,但目前我們可以知道,Spring 創(chuàng)建對象的就是通過配置 bean 標簽,調(diào)用構造器來實現(xiàn)的。如何調(diào)用構造器的,那肯定是反射搞的鬼。

藏在 IOC 背后的 DI

DI,Dependency Injection,即依賴注入。IOC 還體現(xiàn)在自動注入依賴,依賴注入這詞聽起來不太明白,簡單的理解為綁定數(shù)據(jù),這是一種具體的技術,IOC 是思想,DI 是技術實現(xiàn)。對象之中需要其它的對象,類如 Service 層中需要 DAO 層對象,我們不需要在 Service 中手動 new 了,只需要配置一下即可。

常用的注入方式有兩種,set 方法注入和構造方法注入。而每一種注入方式中又有注入基本數(shù)據(jù)類型和引用數(shù)據(jù)類型之分。下面就看看如何配置。

set 方法注入

通過 property 標簽來配置屬性,基本數(shù)據(jù)類型使用 value 屬性即可,若是引用類型則使用 ref 。注意,User 對象中要有 Car 引用并且提供其 set 方法。

構造方法注入

這個配置看一眼就基本理解了,非常簡單,說個小細節(jié),對象的創(chuàng)建需要執(zhí)行構造器,我們在初始化對象的時候會使用反射通過全類名得到對象,而這時就需要一個空參的構造器,我們不提供構造器的情況下,程序會自動為我們提供一個空參構造器,但是一旦重寫構造器,我們就需要提供空參構造器,不然就報錯。

雖然還有其它屬性注入的方式,比方說 p 名稱空間注入,spel 注入,但是這些都不重要!最常用的就一個那就是 set 方法注入。抓住重點,簡單省時。

總結(jié)一下,以上主要說了什么是 Spring,如何搭建入門項目,解釋了 IOC 思想,以及站在 IOC 背后的技術 DI,我們使用 set 方式注入基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,當然,這些東西都構建在反射之上。

AOP 介紹

AOP 是我們經(jīng)常聽到的概念,然而聽的太多我們卻忘記了最初的定義,全稱 Aspect Oriented Programming 翻譯過來就是面向切面編程。首先,要搞清楚這是一種思想,Spring 的核心思想就有 AOP 。

嘗試理解一下 AOP 的思想,簡單來說就是“縱向重復,橫向抽取”這很抽象,舉幾個例子,F(xiàn)ilter 的思想,過濾器在解決亂碼的時候不需要我們在每一個類中都寫處理亂碼的代碼。而是直接由 Fliter 來統(tǒng)一處理。還有攔截器的思想,我們在 Action 中需要對參數(shù)進行校驗、封裝,而攔截器又是統(tǒng)一對參數(shù)進行校驗、封裝。

不管是 Fliter 還是攔截器,都是面向切面編程思想的具體應用。而我們今天說的 Spring 中的 AOP 又是如何體現(xiàn)呢?

動態(tài)代理和 cglib 代理

那就是通過代理,Spring 中通過代理達到統(tǒng)一增強代理對象的目的,而不需要對類中的方法一個一個增強。我們以前接觸過動態(tài)代理,知道在動態(tài)代理中我們的代理對象和被代理對象需要實現(xiàn)同一個接口,在 Spring 中無法保證每個需要增強的類都實現(xiàn)接口,所以就需要引用另外一種代理技術 cglib 代理。

總結(jié)一下就是 Spring 中通過代理來體現(xiàn) AOP 的思想,而代理的實現(xiàn)又分為動態(tài)代理和 cglib 代理。動態(tài)代理要求代理類和被代理類實現(xiàn)同一個接口。而 cglib 是繼承代理,代理對象只需繼承被代理對象即可實現(xiàn)。在 Spring 中優(yōu)先使用動態(tài)代理。

兩種代理方式有不同的測試代碼,這里我不再展示,當我敲代碼的時候我突然想到來上海第一次面試的時候,面試官就讓我實現(xiàn)一下 Spring 中的 AOP,現(xiàn)在終于想通了,就是讓我寫一下兩種代理方法的實現(xiàn)呀??上?,當時一臉懵逼……

Spring 中與 AOP 相關名詞

連接點(joinPoint): 在目標對象中,所有可以增強的方法。

切入點(pointCut): 在目標對象中,已經(jīng)增強的方法。

增強/通知(advice): 增強的代碼。

目標對象(target): 被代理對象。

織入(weaving): 將通知應用到到連接點。

代理(Proxy): 將通知織入到目標對象形成代理對象。

切面(aspect): 切入點+通知。

下面通過代碼展示一下 Spring 中 AOP 的展示,順帶看看與這幾個名詞的對象關系。

上面的整個過程就是 Spring 中 AOP 的體現(xiàn),將通知織入到目標對象中形成代理的這么一個過程。我們?yōu)榱诉@個需要準備目標對象,通知對象,還要學會如何配置切點和切面。

上面只是為了測試一下能否正確的生成代理對象,而在 Spring 中真正應用 AOP 的是對事務的處理。Spring AOP 實質(zhì)就是幫我們生成代理對象,而這個代理對象包含了對事務的處理。我們通過配置即可生成代理對象,而不需要我們再手敲代碼處理事務。

在 Spring 中還提供了使用注解來配置,注釋的出現(xiàn)就是為了替換配置文件,然而注釋使用的不多。

總結(jié)一下,IoC 和 AOP 都是 Spring 中的核心概念,IoC 體現(xiàn)在 Spring 會為我們自動創(chuàng)建對象,由以前的手動 new 對象,到現(xiàn)在 Spring 統(tǒng)一管理。

我想到一個例子來說明一下 AOP,高速路上的收費站就是一個切面,Spring 的 IoC 就是一個發(fā)車站,負責維護汽車對象和依賴對象汽車上的人,車就是目標對象,而我們要生成的代理對象就是通過收費站的汽車。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Java之BigDecimal實現(xiàn)詳解

    Java之BigDecimal實現(xiàn)詳解

    這篇文章主要介紹了Java之BigDecimal實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • 在Mac OS上安裝Java以及配置環(huán)境變量的基本方法

    在Mac OS上安裝Java以及配置環(huán)境變量的基本方法

    這篇文章主要介紹了在Mac OS上安裝Java以及配置環(huán)境變量的基本方法,包括查看所安裝Java版本的方法,需要的朋友可以參考下
    2015-10-10
  • Java中自動生成構造方法詳解

    Java中自動生成構造方法詳解

    這篇文章主要介紹了Java中自動生成構造方法詳解的相關資料,需要的朋友可以參考下
    2017-04-04
  • Java8新特性stream和parallelStream區(qū)別

    Java8新特性stream和parallelStream區(qū)別

    這篇文章主要介紹了Java8新特性stream和parallelStream區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 如何在pom文件中引入本地jar包并打包

    如何在pom文件中引入本地jar包并打包

    在項目中使用本地JAR文件的方法有很多,下面這篇文章主要給大家介紹了關于如何在pom文件中引入本地jar包并打包的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • Java多種獲取項目路徑下的文件方式

    Java多種獲取項目路徑下的文件方式

    文章介紹了在Java項目中獲取resources文件夾下文件的InputStream的多種方法,包括使用類加載器、上下文類加載器、系統(tǒng)屬性和Paths類
    2024-12-12
  • java compare compareTo方法區(qū)別詳解

    java compare compareTo方法區(qū)別詳解

    本文主要介紹了java compare compareTo方法區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot使用RestTemplate實現(xiàn)HTTP請求詳解

    SpringBoot使用RestTemplate實現(xiàn)HTTP請求詳解

    這篇文章主要為大家詳細介紹了SpringBoot如何使用RestTemplate實現(xiàn)進行HTTP請求,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • 如何獲取MyBatis Plus執(zhí)行的完整的SQL語句

    如何獲取MyBatis Plus執(zhí)行的完整的SQL語句

    這篇文章主要介紹了如何獲取MyBatis Plus執(zhí)行的完整的SQL語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java多線程模擬搶紅包功能

    java多線程模擬搶紅包功能

    這篇文章主要為大家詳細介紹了java多線程模擬搶紅包功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

会宁县| 都匀市| 五河县| 永定县| 广南县| 北川| 桐柏县| 仪陇县| 肃南| 平乐县| 崇左市| 邻水| 呈贡县| 怀安县| 通榆县| 茶陵县| 石门县| 文登市| 嵊州市| 磐石市| 九台市| 山丹县| 上高县| 和静县| 阳西县| 延吉市| 阳高县| 博湖县| 宜春市| 廊坊市| 扶绥县| 新乐市| 余江县| 平凉市| 沭阳县| 宁强县| 肇东市| 日土县| 庆元县| 延长县| 乌拉特前旗|