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

Spring基礎(chǔ)篇之初識DI和AOP

 更新時間:2018年01月01日 10:07:34   作者:陳本布衣  
這篇文章主要為大家詳細(xì)介紹了Spring基礎(chǔ)篇之初識DI和AOP,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

  作為從事java開發(fā)的碼農(nóng),Spring的重要性不言而喻,你可能每天都在和Spring框架打交道。Spring恰如其名的,給java應(yīng)用程序的開發(fā)帶了春天般的舒爽感覺。Spring,可以說是任何一個java開發(fā)者通往技術(shù)高階的必備基礎(chǔ)。當(dāng)然,要學(xué)好Spring,尤其是了解Spring的底層原理并不容易,需要花費(fèi)很多時間和精力來潛心的研習(xí),并在實(shí)際的項(xiàng)目中不斷的試錯和總結(jié),才能形成屬于自己的思維理解。博主對Spring最初的認(rèn)識頗淺,項(xiàng)目中遇到問題依靠度娘大概也能籠而統(tǒng)之的解決。不過呢,接觸Spring這么一年多時間里,對其框架體系認(rèn)知比較雜亂,深層技術(shù)依然是霧里看花一般,沒有形成自己的認(rèn)知和理解,這對編程技術(shù)的提升是十分不利的。鑒于此,才決定靜下心來從頭至尾系統(tǒng)的學(xué)習(xí)Spring框架,并通過博客的形式記錄學(xué)習(xí)點(diǎn)滴,分享技術(shù)知識,算是拋磚引玉吧。好了,閑言少敘,咱們開始切入正題——

Spring框架核心介紹

  DI(Dependency Injection),依賴注入,和我們常聽說的另一個概念 IOC(控制反轉(zhuǎn))其實(shí)歸根結(jié)底實(shí)現(xiàn)的功能是相同的,只是同樣的功能站在不同的角度來闡述罷了。這里博主就不去過多的辨析,度娘上有一大堆解釋。我們需要知道的是,什么叫依賴注入,為什么要依賴注入。搞清這兩點(diǎn),我想對Spring的學(xué)習(xí)在思想上就算是上道了。

  在沒用使用Spring的時候——也就是沒有依賴注入的時候,java應(yīng)用程序的類與類之間要實(shí)現(xiàn)相互的功能協(xié)作是比較費(fèi)勁的,某個類(A)要實(shí)現(xiàn)它的功能如果需要依賴另一個類(B)的協(xié)作的話,就需要在A類中主動創(chuàng)建出B類的對象,才能使用B類的方法完成功能(這里看官就不要去糾結(jié)靜態(tài)方法之類的情況了)。這等于是A類需要負(fù)責(zé)B類對象整個生命周期的管理。在極度簡單的情況下,在一個類中new出另一個類的對象似乎并沒有什么問題,但是復(fù)雜的應(yīng)用程序類與類的協(xié)作關(guān)系往往是多邊的,我們并不知道一個類功能的實(shí)現(xiàn)會依賴多少個另類對象來協(xié)作,所以在類中自行創(chuàng)建對象并且管理對象的整個生命周期,會造成代碼的高度耦合以及不可想象的復(fù)雜度。那么,試想,如果我們能將對象的生命周期交給第三方組件來管理,當(dāng)某個類需要另外的對象時第三方組件就直接創(chuàng)建出來交給它,這樣,類就可以只專注于自己功能的實(shí)現(xiàn),而不用去管理其他類對象的生命周期,這樣類的功能就單純了很多。是的,你一定已經(jīng)明白了,Spring(容器)就是這個第三方組件。我們只需要告訴Spring(容器)有哪些對象需要管理就行了,不用去關(guān)心Spring框架是如何創(chuàng)建對象的。這樣,當(dāng)某個類A需要類B對象時,如果類B已經(jīng)聲明交給了Sping容器管理,那么在程序運(yùn)行到類A需要類B時,Spring容器就通過依賴注入的方式,將類B對象注入到類A中協(xié)助完成業(yè)務(wù)功能。通過第三方組件的依賴注入,對象無需再自行的創(chuàng)建和管理類與類之間的依賴關(guān)系了。對象的創(chuàng)建依賴注入的方式也有多種,譬如接口注入,構(gòu)造方法注入,setter方法注入等等。說到這里,你對依賴注入應(yīng)該有比較直白的認(rèn)知了。至于為什么要依賴注入,上文已經(jīng)說得很明白了,就是為了減少代碼中組件之間的耦合度,我們還是先通過簡單示例來直觀感受下依賴注入比自己管理對象的好處吧——

public class Man implements Human {
  private QQCar car;
  public Man() {
    this.car = new QQCar();
  }
  @Override
  public void xiabibi() {
  }
  public void driveCar(){
    car.drive();
  }
}

    接口Car暫有兩個實(shí)現(xiàn):奔馳車和QQ車,在以上Man類和QQCar類高度耦合的代碼中,老司機(jī)通過構(gòu)造器只創(chuàng)建了QQ車對象,所以只能開QQ車,那么老司機(jī)想開奔馳怎么辦呢,你讓他重新創(chuàng)建奔馳車的對象嗎?這樣高度耦合的代碼似乎是毫無辦法的,那么,我們通過注入對象的方式對上述代碼做一番改進(jìn):

public class Man implements Human {
  private Car car;
  public Man(Car car) {
    this.car = car;
  }
  @Override
  public void xiabibi() {
  }

  public void driveCar() {
    car.drive();
  }
}

 以上代碼根據(jù)多態(tài)特性,通過構(gòu)造器接口注入的方式屏蔽掉了具體的對象實(shí)現(xiàn),這樣,老司機(jī)就能想開什么車就開什么車了。這就是依賴注入帶來的好處。

  AOP(Aspect Oriented Programming),面向切面編程。日常開發(fā)中,我們在完成某個業(yè)務(wù)功能的時候,寫了一堆代碼,到最后代碼優(yōu)化的時候發(fā)現(xiàn),真正完成業(yè)務(wù)的代碼可能就那么兩句,而其余都是與該部分業(yè)務(wù)相關(guān)度不大,僅僅是為了實(shí)現(xiàn)某種技術(shù)的代碼,是完全可以抽離出去的,于是很自然的,我們會將其抽取成一個工具類,這樣凡是用到的地方只需調(diào)用一下工具方法就ok了。我們再站高一點(diǎn)看,各個業(yè)務(wù)模塊的功能組件中除了完成相關(guān)的業(yè)務(wù)功能外,都有涉及日志、事務(wù)、安全控制等額外的操作等。這些并不是模塊的核心功能,卻又不可或缺。如果將這些額外功能添加進(jìn)代碼,業(yè)務(wù)系統(tǒng)每個組件都來一套又顯得太過重復(fù),而且讓業(yè)務(wù)代碼顯得混亂,不夠純粹。這個時候,你問上帝,可不可以讓你的業(yè)務(wù)代碼只專注于業(yè)務(wù)的實(shí)現(xiàn),不去管什么日志、事務(wù)等不相干的東西?喔,上帝說沒問題,于是就有了AOP。如果說依賴注入的目的是讓相互協(xié)作的組件保持一種較為松散的耦合狀態(tài)的話,AOP則是將遍布應(yīng)用各處的功能分離出來形成可重用的組件。通俗點(diǎn)說,日志、事務(wù)等都是可以重用的組件,我們完全可以將分散于業(yè)務(wù)代碼各處的日志、事務(wù)、安全等功能代碼抽離出成為一個單獨(dú)的工具組件,在Spring的配置中將其進(jìn)行聲明為一個功能切面,再告訴Spring你想在哪些地方、什么時機(jī)使用(切入)這些可重用組件就行了。這就是我對面向切面的簡單釋義。該篇只是引子,所以博主就只是簡單闡述一下概念,不做具體的代碼、配置實(shí)現(xiàn),在會在后續(xù)的博文中將陸續(xù)奉上,歡迎拍磚。

相關(guān)文章

  • 使用Sentinel自定義返回和實(shí)現(xiàn)區(qū)分來源方式

    使用Sentinel自定義返回和實(shí)現(xiàn)區(qū)分來源方式

    這篇文章主要介紹了使用Sentinel自定義返回和實(shí)現(xiàn)區(qū)分來源方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • java字符串中${}或者{}等的占位符替換工具類

    java字符串中${}或者{}等的占位符替換工具類

    今天小編就為大家分享一篇關(guān)于java字符串中${}或者{}等的占位符替換工具類,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java中的CopyOnWriteArrayList容器解析

    Java中的CopyOnWriteArrayList容器解析

    這篇文章主要介紹了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允許并發(fā)讀,讀操作是無鎖的,性能較高。至于寫操作,比如向容器中添加一個元素,則首先將當(dāng)前容器復(fù)制一份,然后在新副本上執(zhí)行寫操作,需要的朋友可以參考下
    2023-12-12
  • SpringBoot項(xiàng)目如何設(shè)置權(quán)限攔截器和過濾器

    SpringBoot項(xiàng)目如何設(shè)置權(quán)限攔截器和過濾器

    這篇文章主要介紹了使用lombok時如何自定義get、set方法問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring Boot命令行運(yùn)行器的實(shí)現(xiàn)方法

    Spring Boot命令行運(yùn)行器的實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring Boot命令行運(yùn)行器的實(shí)現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • 3分鐘快速搞懂Java的橋接方法示例

    3分鐘快速搞懂Java的橋接方法示例

    這篇文章主要介紹了3分鐘快速搞懂Java的橋接方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Idea連接數(shù)據(jù)庫并執(zhí)行SQL語句的方法示例

    Idea連接數(shù)據(jù)庫并執(zhí)行SQL語句的方法示例

    這篇文章主要介紹了Idea連接數(shù)據(jù)庫并執(zhí)行SQL語句的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java封裝好的mail包發(fā)送電子郵件的類

    Java封裝好的mail包發(fā)送電子郵件的類

    本文給大家分享了2個java封裝好的mail包發(fā)送電子郵件的類,并附上使用方法,小伙伴們可以根據(jù)自己的需求自由選擇。
    2016-01-01
  • java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值

    java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值

    這篇文章主要介紹了java正則表達(dá)式如何獲取xml文件中指定節(jié)點(diǎn)的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java非法字符: ‘\ufeff‘問題及說明

    Java非法字符: ‘\ufeff‘問題及說明

    這篇文章主要介紹了Java非法字符: ‘\ufeff‘問題及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

武鸣县| 寿宁县| 新晃| 淮北市| 台南市| 河曲县| 富川| 乐昌市| 彭阳县| 巩义市| 青阳县| 凌海市| 五河县| 都匀市| 都兰县| 河池市| 无棣县| 杭锦后旗| 海丰县| 建宁县| 绵阳市| 红桥区| 五常市| 正安县| 五常市| 成武县| 汤原县| 宜黄县| 专栏| 禹州市| 荆门市| 铜山县| 开鲁县| 沙坪坝区| 尼木县| 武定县| 白朗县| 陈巴尔虎旗| 嵊州市| 罗山县| 射洪县|