javascript
Spring IoC、AOP、Transaction、MVC 归纳小结
前言
如果說有什么框架是Java程序員必然會學習、使用到的,那么Spring肯定是其中之一。本篇博客,將根據博主在日常工作中對Spring的使用做一個系統的歸納小結。
Spring的一些概念和思想
Spring的核心:AOP、IOC。
簡單點說,就是把對象交給Spring進行管理,通過面向切面編程來實現一些"模板式"的操作,使得程序員解放出來,可以更加關注業務實現。
Spring已經是一站式的開源框架解決方案,而且形成了Spring生態。
關于IOC
IOC,從操作上來看,要么通過XML配置實現,要么通過注解的方式實現。在實際開發中,越來越流行注解的方式。
需要根據你使用到的功能,來進行依賴的引入,以及XML的Schema約束引用。
Spring的核心配置文件,名稱和位置不固定,不過在實際開發中,一般指定為applicationContext-xxx.xml的方式。這種方式,有2個好處:第一,可以對Spring的配置文件進行分模塊管理;第二,由于統一的前綴,方便正則加載這些配置文件。
Springbean的XML配置創建
直接通過來進行,這樣的前提是該類存在無參數的構造方法(背后的原理就是通過反射實例化的)。這種方式是實際中最常使用的,當然,除此之外還存在靜態工廠、實例工廠的方式創建。
另外一點還需要注意的是:bean是單例的,還是多例的?
bean標簽中存在scope屬性用于說明:
singleton:單例,default
prototype:多例
request/session等。
bean的屬性注入:XML方式
bean的XML創建是通過反射進行,那么bean的屬性注入,是如何進行的呢?
可以在構造bean的時候,提供有參數的構造方法進行設置;
可以在提供setter方法,進行設置;(最常用)
什么接口注入,什么P名稱空間注入,這些實際都不用……
?或者
要么利用value直接給出屬性值,要么通過ref引用另一個bean。
基于注解方式的bean創建以及注入
因為Spring注解的實現是需要AOP的支持,因此在依賴方面需要注意,其次,要在XML中開啟注解掃描:
實際上這個配置,會讓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(),然后在增強方法上直接使用類似@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的梳理就結束了!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Spring IoC、AOP、Transaction、MVC 归纳小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 8 中处理日期和时间示例
- 下一篇: MySQL性能突发事件问题排查技巧