Spring基礎篇之初識DI和AOP

2022-09-29 04:36:07 字數 2594 閱讀 8275

前言

作為從事j**a開發的碼農,spring的重要性不言而喻,你可能每天都在和spring框架打交道。spring恰如其名的,給j**a應用程式的開發帶了春天般的舒爽感覺。spring,可以說是任何乙個j**a開發者通往技術高階的必備基礎。當然,要學好spring,尤其是了解spring的底層原理並不容易,需要花費很多時間和精力來潛心的研習,並在實際的專案中不斷的試錯和總結,才能形成屬於自己的思維理解。博主對spring最初的認識頗淺,專案中遇到問題依靠度娘大概也能籠而統之的解決。不過呢,接觸spring這麼一年多時間裡,對其框架體系認知比較雜亂,深層技術依然是霧裡看花一般,沒有形成自己的認知和理解,這對程式設計技術的提公升是十分不利的。鑑於此,才決定靜下心來從頭至尾系統的學習spring框架,並通過部落格的形式記錄學習點滴,分享技術知識,算是拋磚引玉吧。好了,閒言少敘,咱們開始切入正題——

spring框架核心介紹

di(dependency injection),依賴注入,和我們常聽說的另乙個概念 ioc(控制反轉)其實歸根結底實現的功能是相同的,只是同樣的功能站在不同的角度來闡述罷了。這裡博主就不去過多的辨析,度娘上有一大堆解釋。我們需要知道的是,什麼叫依賴注入,為什麼要依賴注入。搞清這兩點,我想對spring的學習在思想上就算是上道了。

在沒用使用spring的時候——也就是沒有依賴注入的時候,j**a應用程式的類與類之間要實現相互的功能協作是比較費勁的,某個類(a)要實現它的功能如果需要依賴另乙個類(b)的協作的話,就需要在a類中主動建立出b類的物件,才能使用b類的方法完成功能(這裡看官就不要去糾結靜態方法之類的情況了)。這等於是a類需要負責b類物件整個生命週期的管理。在極度簡單的情況下,在乙個類中new出另乙個類的物件似乎並沒有什麼問題,但是複雜的應用程式類與類的協作關係往往是多程式設計客棧邊的,我們並不知道乙個類功能的實現會依賴多少個另類物件來協作,所以在類中自行建立物件並且管理物件的整個生命週期,會造成**的高度耦合以及不可想象的複雜度。那麼,試想,如果我們能將物件的生命週期交給第三方元件來管理,當某個類需要另外的物件時第三方元件就直接建立出來交給它,這樣,類就可以只專注於自己功能的實現,而不用去管理其他類物件的生命週期,這樣類的功能就單純了很多。是的,你一定已經明白了,spring(容器)就是這個第三方元件。我們只需要告訴spring(容器)有哪些物件需要管理就行了,不用去關心spring框架是如何建立物件的。這樣,當某個類a需要類b物件時,如果類b已經宣告交給了sping容器管理,那麼在程式執行到類a需要類b時,spring容器就通過依賴注入的方式,將類b物件注入到類a中協助完成業務功能。通過第三方元件的依賴注入,物件無需再自行的建立和管理類與類之間的依賴關係了。物件的建立依賴注入的方式也有多種,譬如介面注入,構造方法注入,setter方法注入等等。說到這裡,你對依賴注入應該有比較直白的認知了。至於為什麼要依賴注入,上文已經說得很明白了,就是為了減少**中元件之間的耦合度,我們還是先通過簡單示例來直觀感受下依賴注入比自己管理物件的好處吧——

public class man implements human

@override

public void xiabibi()

public void drivecar()

}www.cppcns.com介面car暫有兩個實現:賓士車和qq車,在以上man類和qqcar類高度耦合的**中,老司機通過構造器只建立了qq車物件,所以只能開qq車,那麼老司機想開賓士怎麼辦呢,你讓他重新建立賓士車的物件嗎?這樣高度耦合的**似乎是毫無辦法的,那麼,我們通過注入物件的方式對上述**做一番改進:

public class man implements human

@override

public void xiabibi()

public void drivecar()

}以上**根xmarz據多型特性,通過構造器介面注入的方式遮蔽掉了具體的物件實現,這樣,老司機就能想開什麼車就開什麼車了。這就是依賴注入帶來的好處。

aop(aspect oriented programming),面向切面程式設計。日常開發中,我們在完成某個業務功能的時候,寫了一堆**,到最後**優化的時候發現,真正完成業務的**可能就那麼兩句,而其餘都是與該部分業務相關度不大,僅僅是為了實現某種技術的**,是完全可以抽離出去的,於是很自然的,我們會將其抽取成乙個工具類,這樣凡是用到的地方只需呼叫一下工具方法就ok了。我們再站高一點看,各個業務模組的功能元件中除了完成相關的業務功能外,都有涉及日誌、事務、安全控制等額外的操作等。這些並不是模組的核心功能,卻又不可或缺。如果將這些額外功能新增進**,業務系統每個元件都來一套又顯得太過重複,而且讓業務**顯得混亂,不夠純粹。這個時候,你問上帝,可不可以讓你的業務**只專注於業務的實現,不去管什麼日誌、事務等不相干的東西?喔,上帝說沒問題,於是就有了aop。如果說依賴注入的目的是讓相互協作的元件保持一種較為鬆散的耦合狀態的話,aop則是將遍布應用各處的功能分離出來形成可重用的元件。通俗點說,日誌、事務等都是可以重用的元件,我們完全可以將分散於業務**各處的日誌、事務、安全等功能**抽離出成為乙個單獨的工具元件,在spring的配置中將其進行宣告為乙個功能切面,再告訴spring你想在哪些地方、什麼時機使用(切入)這些可重用元件就行了。這就是我對面向切面的簡單釋義。該篇只是引子,所以博主就只是簡單闡述一下概念,不做具體的**、配置實現,在會在後續的博文中將陸續奉上,歡迎拍磚。

本文標題: spring基礎篇之初識di和aop

本文位址: /ruanjian/j**a/216296.html

OSPF之初識篇

本人初學tcp ip協議,ospf為重點。現在此地寫下學習逐步歷程 本篇為基礎入門第一步 一 背景 ospf是鏈結狀態協議中最具代表性的協議,鏈結狀態協議與距離向量協議同為動態路由協議的分類 路由分為動態路由和靜態路由,動態路由協議即針對動態路由的協議。路由協議又對路由以及路由表起到了什麼作用呢?以...

C和指標之初識篇

一 基礎細節 1.程式從標準輸入中讀取輸入行並在標準輸出中列印這些輸入行 首先讀取一串列標號,每一行的列標號從0 開始,以乙個負數作為結束標誌,列標號都是成對出現,表示讀取列的範圍。輸入如下 3 7 8 15 1 輸出第3 7列,8 15列qwertyuiopasdfghjkl i love you...

python 基礎之初識

python 它來自於英國超現實主義喜劇團體,而不是來自蛇。python安裝 目前大多數使用的 3.0版本,與 2.0相比它語法有些許更改,比如 print 函式等。其次近些年來大家都在向 3.03.0 版本吧。python程式設計基礎 1.整型 浮點型 字串資料型別 整型 2 1 0 1 2 浮點...