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

Spring中IOC和AOP的深入講解

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

前言

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

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

Spring 簡介

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

一句話,Spring 是項(xiàng)目中對象的管家,負(fù)責(zé)管理項(xiàng)目中用到的所有對象。所以在項(xiàng)目三層架構(gòu)中,Spring 不屬于某一特定層。

Spring 的 Hello World

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

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

什么是 IOC

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

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

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

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

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

藏在 IOC 背后的 DI

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

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

set 方法注入

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

構(gòu)造方法注入

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

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

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

AOP 介紹

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

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

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

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

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

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

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

Spring 中與 AOP 相關(guān)名詞

連接點(diǎn)(joinPoint): 在目標(biāo)對象中,所有可以增強(qiáng)的方法。

切入點(diǎn)(pointCut): 在目標(biāo)對象中,已經(jīng)增強(qiáng)的方法。

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

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

織入(weaving): 將通知應(yīng)用到到連接點(diǎn)。

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

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

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    Java中自動生成構(gòu)造方法詳解

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

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

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

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

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

    Java多種獲取項(xiàng)目路徑下的文件方式

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

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

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

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

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

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

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

    java多線程模擬搶紅包功能

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

最新評論

三门县| 吴桥县| 营山县| 锦屏县| 岐山县| 沂源县| 温州市| 方山县| 义乌市| 哈尔滨市| 广汉市| 响水县| 雅安市| 湟源县| 洛川县| 白朗县| 集安市| 和林格尔县| 台东市| 襄城县| 云和县| 福鼎市| 新化县| 桐梓县| 绥滨县| 华宁县| 丽江市| 桃园市| 原阳县| 肇州县| 遂川县| 福鼎市| 池州市| 泌阳县| 黄大仙区| 鄯善县| 永济市| 金溪县| 浪卡子县| 临高县| 姚安县|