前言java
Spring的一些概念和思想程序員
關於IOCweb
關於AOP面試
Spring與web整合的原理編程
若是說有什麼框架是Java程序員必然會學習、使用到的,那麼Spring確定是其中之一。本篇博客,將根據博主在平常工做中對Spring的使用作一個系統的概括小結。session
Spring的核心:AOP、IOC。架構
簡單點說,就是把對象交給Spring進行管理,經過面向切面編程來實現一些"模板式"的操做,使得程序員解放出來,能夠更加關注業務實現。app
Spring已是一站式的開源框架解決方案,並且造成了Spring生態。框架
小編分類整理了許多java進階學習材料和BAT面試題,須要資料的請加JAVA高階學習Q羣:8515318105;就能領取2019年java架構師進階學習資料和BAT面試題。學習
IOC,從操做上來看,要麼經過XML配置實現,要麼經過註解的方式實現。在實際開發中,愈來愈流行註解的方式。
須要根據你使用到的功能,來進行依賴的引入,以及XML的Schema約束引用。
Spring的核心配置文件,名稱和位置不固定,不過在實際開發中,通常指定爲applicationContext-xxx.xml的方式。這種方式,有2個好處:第一,能夠對Spring的配置文件進行分模塊管理;第二,因爲統一的前綴,方便正則加載這些配置文件。
bean的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基礎之上完成操做。
小編分類整理了許多java進階學習材料和BAT面試題,須要資料的請加JAVA高階學習Q羣:8515318105;就能領取2019年java架構師進階學習資料和BAT面試題。
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…)提供了不一樣的事務實現類。
咱們能夠看個例子:
對於多個數據源,固然,咱們須要定義多個事務管理器,同時也得開啓事務註解。多個事務管理器,能夠經過qualifier屬性進行區分。
配置完畢後,直接在service層的類或者方法上,使用
@Transactional(value = "gcs", rollbackFor = Exception.class)
從操做上來說,就是在web.xml中去配置一個監聽器,而後指定Spring的配置文件便可。
每個WEB項目,都存在一個ServletContext對象,而咱們配置的監聽器就是對它進行監聽,監聽器會加載Spring的配置文件,把建立的對象放到ServletContext域(也就是setAttribute方法),獲取對象的時候直接getAttribute便可!
好了,到這裏,Spring的梳理就結束了!
小編分類整理了許多java進階學習材料和BAT面試題,須要資料的請加JAVA高階學習Q羣:8515318105;就能領取2019年java架構師進階學習資料和BAT面試題。