大家好,我是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
