SpringBoot AOP 與 IoC


Spring的核心就是AOP與IoC,想要學習SpringBoot,首先得理解這些概念:

AOP(Aspect Oriented Programming 面向切面編程)

IoC(Inversion of Control 控制反轉)

DI(Dependency Injection 依賴注入)

AOP是什么

非常簡單易懂的AOP文章:https://www.cnblogs.com/Wolfmanlq/p/6036019.html

AOP - Aspect Oriented Programming(面向切面)是一種編程范式,算是一個比較熱門的話題,以至於有一種論調說“AOP會替代OOP”,然而事實上AOP跟OOP的關注點並不相同。面向對象(OOP)的目的在於抽象 ,而面向切面(AOP)的目的在於解耦。

在Java中面向切面編程需要使用反射(動態代理)實現,操作比較麻煩。而在Python語言中則提供了一個很好用的語法糖–裝飾器.

AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。其與設計模式完成的任務差不多,是提供另一種角度來思考程序的結構,來彌補面向對象編程的不足。例如:針對某些業務邏輯 添加日志、權限、事務等功能。

比如,若是需要一個記錄日志的功能,首先想到的是在方法中通過log4j或其他框架來進行記錄日志,但寫下來發現一個問題,在整個業務中其實核心的業務代碼並沒有多少,都是一些記錄日志或其他輔助性的一些代碼。而且很多業務有需要相同的功能,比如都需要記錄日志,這時候又需要將這些記錄日志的功能復制一遍,即使是封裝成框架,也是需要調用之類的,在此處使用復雜的設計模式又得不償失。

因此就需要面向切面出場了!!!

Aop 常用術語

切面(Aspect):

一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。在Spring AOP中,切面可以使用基於模式或者基於@Aspect注解的方式來實現。

連接點(Joinpoint):

在程序執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。在Spring AOP中,一個連接點總是表示一個方法的執行。

通知(Advice):

在切面的某個特定的連接點上執行的動作。其中包括了“around”、“before”和“after”等不同類型的通知(通知的類型將在后面部分進行討論)。許多AOP框架(包括Spring)都是以攔截器做通知模型,並維護一個以連接點為中心的攔截器鏈。

切入點(Pointcut):

匹配連接點的斷言。通知和一個切入點表達式關聯,並在滿足這個切入點的連接點上運行(例如,當執行某個特定名稱的方法時)。切入點表達式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。

引入(Introduction):

用來給一個類型聲明額外的方法或屬性(也被稱為連接類型聲明(inter-type declaration))。Spring允許引入新的接口(以及一個對應的實現)到任何被代理的對象。例如,你可以使用引入來使一個bean實現IsModified接口,以便簡化緩存機制。

目標對象(Target Object):

被一個或者多個切面所通知的對象。也被稱做被通知(advised)對象。既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個被代理(proxied)對象。

AOP代理(AOP Proxy):

AOP框架創建的對象,用來實現切面契約(例如通知方法執行等等)。在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。

織入(Weaving):

把切面連接到其它的應用程序類型或者對象上,並創建一個被通知的對象。這些可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。Spring和其他純Java AOP框架一樣,在運行時完成織入。

IoC是什么

IoC - Inversion of Control 控制反轉,它不是一種技術,而是一種設計思想。

Java程序中的每個業務邏輯至少需要兩個或以上的對象來協作完成,通常每個對象在使用它的合作對象時,自己需要通過new object() 這樣的語法來完成合作對象的初始化工作,這就會使得:對象間的耦合度加深。

Spring IOC的思想是:Spring容器來實現這些相互依賴對象的創建、協調、管理和銷毀工作,對象只需要關注業務邏輯本就可以了,而不是傳統的在你的對象內部直接控制。;也就可以被稱之為:對象如何得到它的合作對象的責任被反轉了(IOC/DI)。

DI其實是IOC的另外一種說法,DI是由Martin Fowler 在2004年初的一篇論文中首次提出的。他總結:控制的什么被反轉了?就是:獲得依賴對象的方式反轉了。

Spring所倡導的開發方式是:所有的類都會在Spring容器中登記,告訴Spring你是個什么東西?你需要什么東西?然后Spring會在系統運行到適當的時候,自動把你要的東西主動給你(而不是在一開始實例化所有對象,從而提高的性能)。所有類的創建、銷毀都由Spring來控制,也就是說控制對象生命周期的不再是引用他的對象,而是Spring。對於某個具體的對象來說,以前是它自己去控制其他對象;現在是所有對象都由Spring來控制,這就叫IOC/DI(控制反轉 或 依賴注入)。

IOC的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象,這一點是通過DI(Dependency Injection)來實現的。

例如 對象A需要操作數據庫對象,以前需要在A中自己編寫代碼來獲得一個Connection對象;有了Spring后,我們只需要告訴Spring,A中需要一個Connection對象,至於這個Connection如何構造,何時構造,A不關心也不需要知道。在系統運行時,Spring會在適當的時候制造一個Connection對象,然后像打針一樣,自動注射到A對象當中,這樣就完成了對各對象之間關系的控制。

那么DI是如何實現的呢?在Java1.3之后有一個非常重要的特性 Reflection(反射),它允許程序在運行時動態的生成對象、執行對象的方法、改變對象的屬性,Spring就是通過反射來實現自動注入的。

Spring IOC管理的對象,我們稱之為Bean對象,Bean對象就是Spring容器初始化、裝配、管理的對象;除此之外,Bean對象與程序中的其他對象沒有什么區別,那IOC是如何實例化Bean、管理Bean之間的依賴關系呢?答案是: 通過Annotation或XML配置文件來實現手動或自動裝配Bean。

參考文章:
https://blog.csdn.net/happydecai/article/details/79972744
https://blog.csdn.net/jiangyu1013/article/details/72654373
https://blog.csdn.net/zhaoyanjun6/article/details/80669022


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM