Spring歸納小結
前言
如果說有什麼框架是Java程式設計師必然會學習、使用到的,那麼Spring肯定是其中之一。本篇部落格,將根據博主在日常工作中對Spring的使用做一個系統的歸納小結。
Spring的一些概念和思想
Spring的核心:AOP、IOC。
簡單點說,就是把物件交給Spring進行管理,通過面向切面程式設計來實現一些"模板式"的操作,使得程式設計師解放出來,可以更加關注業務實現。
Spring已經是一站式的開源框架解決方案,而且形成了Spring生態。
關於IOC
IOC,從操作上來看,要麼通過XML配置實現,要麼通過註解的方式實現。在實際開發中,越來越流行註解的方式。
需要根據你使用到的功能,來進行依賴的引入,以及XML的Schema約束引用。
Spring的核心配置檔案,名稱和位置不固定,不過在實際開發中,一般指定為applicationContext-xxx.xml的方式。這種方式,有2個好處:第一,可以對Spring的配置檔案進行分模組管理;第二,由於統一的字首,方便正則載入這些配置檔案。
Spring
bean的XML配置建立
直接通過<bean id="" class=""></bean>來進行,這樣的前提是該類存在無引數的構造方法(背後的原理就是通過反射例項化的)。這種方式是實際中最常使用的,當然,除此之外還存在靜態工廠、例項工廠的方式建立。
另外一點還需要注意的是:bean是單例的,還是多例的?
bean標籤中存在scope屬性用於說明:
singleton:單例,default
prototype:多例
request/session等。
bean的屬性注入:XML方式
bean的XML建立是通過反射進行,那麼bean的屬性注入,是如何進行的呢?
可以在構造bean的時候,提供有引數的構造方法進行設定;
可以在提供setter方法,進行設定;(最常用)
什麼介面注入,什麼P名稱空間注入,這些實際都不用......
<bean id="" class="">
<property name="" value=""> 或者<property name="" ref="">
</bean>
要麼利用value直接給出屬性值,要麼通過ref引用另一個bean。
基於註解方式的bean建立以及注入
因為Spring註解的實現是需要AOP的支援,因此在依賴方面需要注意,其次,要在XML中開啟註解掃描:
<context:component-scan base-package="" />
實際上這個配置,會讓Spring在指定包下掃描,把帶有註解標誌的bean例項化,並且會進行屬性注入。(可以參考手寫一個迷你版Spring MVC框架)
建立物件的4個註解:
@Component/@Controller/@Service/@Repository
在這4個註解上,通過value屬性來指定bean的id,通過@scope配合來宣告單例OR多例。(目前這4個註解功能是一樣的,只是為了讓標註類的用途更加清晰,而且Spring留了一手,以後說不定會增強功能呢?)
如何注入屬性?
@Autowired/@Resource/@Qualifier
需要注意的是@Resource是javax包下的,說白了就是J2EE提供的;而@Autowired是Spring提供的。(不必提供setter方法)
@Resource預設按照名稱注入,如果找不到才按照型別注入。
@Autowired預設按照型別注入,可以結合@Qualifier進行名稱注入。
那麼我們需要注意什麼呢?
如果@Autowired進行型別注入,很可能型別會有多個滿足(多型),那麼到底注入哪個呢?所以說,如果按照@Autowired型別注入,一定注意這點,結合@Qualifier。實際開發中,顯然,注入應該是確定的,那麼按照名稱注入,應該是首選!
IOC VS DI
IOC,控制反轉;DI,依賴注入;
只有把物件交給Spring,才能由Spring幫助完成屬性設定;因此,依賴注入不能單獨存在,需要在IOC基礎之上完成操作。
關於AOP
AOP的實現,一種橫向抽取機制,依賴於動態代理模式。
關於AOP的幾個重點概念:
JoinPoint:連線點,說白了,就是可以被增強的方法;
PointCut:切入點,對哪些JoinPoint進行攔截;
Advice:通知,就是攔截後的動作;
Aspect:切面,把增強應用到具體方法的過程;
Spring的AOP需要藉助aspectj來實現,可以通過XML,也可以通過註解來完成。
比如,採用XML方式的話,需要指明用A類的哪個方法對B類的哪些方法上進行增強,這裡就涉及到execution表示式了;
比如,採用註解方式的話,就更加簡單了,先在XML中開啟AOP(<aop:aspectj-autoproxy />),然後在增強方法上直接使用類似@Before(value="execution(具體的表示式)")即可;
其實,在實際開發中,我們對於AOP最常用的就是事務了。
Spring的事務管理
Spring的宣告式事務管理,用的最多的就是基於註解的方式。首先我們得配置一個事務管理器,而事務管理器需要我們注入DataSource(DBCP,c3p0等連線池),這一點好理解,因為是DB的事務。要知道,Spring對不同的DAO層框架(Spring JDBC/MyBatis/Hibernate...)提供了不同的事務實現類。
我們可以看個例子:
Spring註解事務配置
對於多個資料來源,當然,我們需要定義多個事務管理器,同時也得開啟事務註解。多個事務管理器,可以通過qualifier屬性進行區分。
配置完畢後,直接在service層的類或者方法上,使用
@Transactional(value = "gcs", rollbackFor = Exception.class)
Spring與web整合的原理
從操作上來講,就是在web.xml中去配置一個監聽器,然後指定Spring的配置檔案即可。
每一個WEB專案,都存在一個ServletContext物件,而我們配置的監聽器就是對它進行監聽,監聽器會載入Spring的配置檔案,把建立的物件放到ServletContext域(也就是setAttribute方法),獲取物件的時候直接getAttribute即可!
好了,到這裡,Spring的梳理就結束了!
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉發。
Java團長
專注於Java乾貨分享
掃描上方二維碼獲取更多Java乾貨
相關文章
- jQuery學習總結歸納jQuery
- Vue 路由知識點歸納總結Vue路由
- Laravel-admin 問題歸納總結Laravel
- HTTP標頭學習總結歸納HTTP
- 工具歸納
- MHA工具的優缺點歸納總結
- 物件導向知識點總結歸納物件
- 微軟程式歸納新技術:元程式歸納微軟
- openpyxl淺歸納
- Linux基礎優化與安全歸納總結Linux優化
- 微信小程式歸結微信小程式
- pt-osc工具的優缺點歸納總結
- 【PyQt5】QTableWidget 的總結與歸納(轉載)QT
- [PyQt5] QTableWidget 的總結與歸納(轉載)QT
- PTA7~9題目集總結與歸納
- Spring 小總結Spring
- React Fiber原始碼分析 第四篇(歸納總結)React原始碼
- Peer Dependency 一些使用場景的歸納總結
- Spring之Config小結Spring
- 動作遊戲戰鬥系統總結歸納&思考(中)遊戲
- 【組合數學】組合數學簡介 ( 組合思想 2 : 數學歸納法 | 數學歸納法推廣 | 多重歸納思想 )
- ROS入門教程歸納1ROS
- HTML標籤,簡單歸納HTML
- Linux基礎命令歸納大全Linux
- Laravel驗證器用法歸納Laravel
- Kotlin知識歸納(十四) —— 反射Kotlin反射
- HTML5 標籤歸納HTML
- Kotlin知識歸納(八) —— 序列Kotlin
- Kotlin知識歸納(七) —— 集合Kotlin
- Kotlin知識歸納(五) —— LambdaKotlin
- 04-歸納概括題3
- XML與JSON學習歸納XMLJSON
- Java執行緒池歸納Java執行緒
- Java獲取多執行緒執行結果方式的歸納與總結Java執行緒
- 動作遊戲戰鬥系統框架總結歸納&思考(上)遊戲框架
- Java程式設計技巧:if-else優化實踐總結歸納Java程式設計優化
- Spring之RestTemplate使用小結SpringREST
- 追蹤原始碼的方式歸納原始碼