主頁 > 後端開發 > 簡述Spring IOC 和 AOP

簡述Spring IOC 和 AOP

2021-12-27 07:14:06 後端開發

大家好,我是Morning,在CSDN寫文,分享一些Java基礎知識,一些自己認為在學習程序中比較重要的東西,致力于幫助初學者入門,希望可以幫助你進步,感興趣的歡迎關注博主,和博主一起學習Java知識,大家還可以去專欄查看之前的文章,希望未來能和大家共同探討技術,

文章目錄

    • Spring是什么?
    • Spring的優點
    • IOC
      • 概述
      • 基于 xml 配置方式
      • 注解方式
    • AOP
      • 概述
      • 包含的基本概念
      • Spring AOP實作

Spring是什么?

Spring是一個輕量級的,開源的,非侵入式的,IOC、AOP的 Java 開發框架,他可以簡化企業級應用開發而生,

Spring的優點

輕量級的:Spring框架使用的 jar 包都比較小,核心功能所需的 jar 包總共在3M左右(但其實,由于Spring功能過于強大,要想使用它所有功能,所需要的 jar 包數量也比較多),運行占用的資源少,運行效率高,

非侵入式的:撰寫一些業務類(是指那些實作我們所需要的功能的類,比如攔截器,過濾器就不是我們這里說的業務類)的代碼時,這些業務類不需要繼承Spring特定的類,通過一些配置就可以在框架中使用,Spring沒有侵入到我們的代碼中,

IOC:即 Inversion of Control(控制反轉),縮寫為 IOC,就是由 Spring 容器管理物件,而非傳統實作中由程式代碼直接操控,面向介面式編程,使得耦合度降低,(不用Spring的話就是在哪里需要類的物件,就在哪里創建一個,在用了Spring之后,我們不需要自己創建物件了,Spring框架會幫我們管理,我們在用的時候框架會幫我們注入,)把生成物件的控制權反轉給Spring框架,這就是 IOC 名字的含義,

AOP:即Aspect Oriented Programming(面向切面編程),是OOP的延續或者是說提升,通過 Spring 提供的 AOP 功能(其實AOP不是Spring獨有的,本事就是一種設計思想),方便進行面向切面的編程,使業務邏輯各部分之間的耦合度降低,提高代碼的可重用性(公共性(好多地方都能用的到)的代碼,我們程式員不用顯示的呼叫它,框架代理我們去呼叫方法),許多不容易用傳統 OOP 實作的功能可以通過 AOP 輕松應付在 Spring 中,開發人員可以從繁雜的事務管理代碼中解脫出來,通過宣告式方式靈活地進行事務的管理,提高開發效率和質量,

一站式框架:Spring本身也提供了資料訪問功能和web功能,也可以很好的管理其他框架,涵蓋了應用程式開發中的方方面面,

我們在這一次就主要講關于 IOC 和 AOP 的知識點,

IOC

概述

上文中也提到了,IOC的意思是控制反轉,該注意的是,這是一種設計思想,不是一種技術,就是將原來的程式中需要程式員手動創建物件的控制權,交由 Spring 框架來管理

IOC 容器是具有依賴注入功能的容器,負責物件的實體化、物件的初始化,物件和物件之間依賴關系配置、物件的銷毀、對外提供物件的查找等操作,物件的整個生命周期都是由容器來控制,我們需要使用的物件都由 IOC 容器進行管理,不需要我們再去手動通過 new 的方式去創建物件,由 IOC 容器直接幫我們組裝好,當我們需要使用的時候直接從 IOC 容器中直接獲取就可以了,

底層實作是,先決議 xml 檔案或者掃描注解的方式來獲取到需要管理的類,然后通過工廠模式+反射機制來創建物件,然后在使用的時候注入給屬性(你宣告的那個變數,當然了這個變數也需要注解)就好了,不需要你自己用 new 的方式給屬性賦值,

基于 xml 配置方式

Spring IOC 容器管理一個或多個bean,這個 bean 是根據程式員提供給容器的配置元資料創建的,

這些元資料包含了構造Bean定義的一組屬性,

id:生成的物件名
class:全類名
name:物件別名,可以為多個
scope:作用域
singleton(默認值):在 Spring 中只存在一個 bean 實體, 單例模式.
prototype:原型,getBean() 的時候都會 new Bean()
request:bean定義被系結到單個的Http請求生命周期,每次 http 請求都會創建一個 bean,僅在WebApplicationContext環境中有效
session:bean定義被系結到 Http session 生命周期,同一個 http session 共享一個 Bean,不同 Session 使用不同的 Bean,僅在WebApplicationContext環境中有效

<bean id="bean識別符號,也就是名稱" class="全類名"></bean>

Xml 配置方式依賴注入:

指 Spring 創建物件的程序中,將物件依賴屬性(簡單值,集合,物件)通過配置設定給該物件,

實際上的注入方式有倆種,set 方法注入,構造方法注入,

<bean id="" class="">
                            <!-- 基于set方法注入,name是屬性名,ref是另一個bean的id -->
   <property name="" ref=""></property>
                       <!-- 基于構造方法注入-->
    <constructor-arg ref=""/>
</bean>

注解方式

匯入注解所需要的 jar 包(編譯運行的時候可以認識注解),然后開啟注解掃描(編譯和運行的時候找一下注解)

以下注解都可以實作創建物件功能,只是為了后續擴展功能,在不同的層(資料接收層,處理層,與資料庫互動層)使用不同的注解標記,

@Component(value="")   //這里的 value 就相當于上面的 id 
@Service
@Repository

注解方式注入屬性:

@Autowired

@Autowired 是 Spring 提供的注解,可以寫在欄位和 setter 方法上,如果寫在欄位(屬性)上,那么就不需要再寫 setter 方法,默認情況下它要求物件必須存在,也就是不允許屬性值為null,如果允許 null 值,可以設定它的 required 屬性為 false,

AOP

概述

面向切面編程,這是一種通過預編譯方式和運行期間動態代理實作程式功能的統一維護的技術,這里說的是技術,其實也是一種設計思想,利用 AOP 可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率, AOP與OOP(面向物件編程)相比,AOP 是針對業務處理程序中的切面進行提取,它所面對的是某個程序中的某個步驟或階段,這兩種設計思想在目標上有著本質的差異,雖說如此,但是二者還是有聯系的,其實,面向切面編程是對面向物件編程的一種補充,

面向切面的好處就是,可以減少重復,專注業務,這里所說的專注業務的意思就是,那些統一的操作,只寫一次之后就不用管了,比如驗證某些條件(比如,執行所有操作前都需要驗證你是否登錄,這時就不需要你在所有的操作之前都寫一遍驗證是否登錄的代碼),
在這里插入圖片描述

包含的基本概念

連接點(Joinpoint):類中可以被增強的方法,這個方法就被稱為連接點
切入點(pointcut):類中有很多方法可以被增強,但實際中只有 add 和 update被增了,那么 add 和 update 方法就被稱為切入點(實際實作的連接點)
通知(Advice):通知是指一個切面在特定的連接點要做的事情(增強的功能),通知分為方法執行前通知,方法執行后通知,環繞通知等.
切面(Aspect):把通知添加到切入點的程序叫切面.
目標(Target):代理的目標物件(要增強的類)
代理(Proxy):向目標物件應用通知之后創建的代理物件

Spring AOP實作

對于 AOP 這種編程思想,很多框架都進行了實作,Spring 就是其中之一,可以完成面向切面編程,
由于,AspectJ 實作了 AOP 的功能,AspectJ 是一個基于 Java 語言的 AOP框架,它提供了強大的 AOP 功能,且其實作方式更為簡捷,使用更為方便, 而且還支持注解式開發,所以,Spring 又將 AspectJ 的對于 AOP 的實作也引入到了自己的框架中,在 Spring 中使用 AOP 開發時,一般使用 AspectJ 的實作方式,哈哈,也算是站在巨人的肩膀上了,

AspectJ 中常用的通知有五種型別:前置通知(在方法執行之前執行)、后置通知(在方法執行之后執行)、環繞通知(圍繞著方法執行)、例外通知(在方法拋出例外之后執行)、最終通知(或者說是回傳通知,在方法回傳結果之后執行),

好了,本次的分享到這里就結束了,本次的博文內容中知識點比較多,所以有一點枯燥,感謝您的閱讀,博主會在日后給大家分享其他的知識,和大家一起探討,有興趣的可以關注博主,文中有什么不當的地方,歡迎大家在評論區指出,大家一起探討、學習,🤞🤞🤞

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393909.html

標籤:java

上一篇:【MySQL InnoDB 讀書筆記】09 InnoDB 下邏輯存盤結構(二):資料頁的邏輯存盤及實作

下一篇:JAVA從入門到入土之包機制 ,用戶交換Scanner

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more