spring歸納小結(jié)

Spring的一些概念和思想

Spring的核心:AOP、IOC。

簡單點說,就是把對象交給Spring進行管理,通過面向切面編程來實現(xiàn)一些"模板式"的操作,使得程序員解放出來,可以更加關(guān)注業(yè)務(wù)實現(xiàn)。

Spring已經(jīng)是一站式的開源框架解決方案,而且形成了Spring生態(tài)。

關(guān)于IOC

IOC,從操作上來看,要么通過XML配置實現(xiàn),要么通過注解的方式實現(xiàn)。在實際開發(fā)中,越來越流行注解的方式。

需要根據(jù)你使用到的功能,來進行依賴的引入,以及XML的Schema約束引用。

Spring的核心配置文件,名稱和位置不固定,不過在實際開發(fā)中,一般指定為applicationContext-xxx.xml的方式。這種方式,有2個好處:第一,可以對Spring的配置文件進行分模塊管理;第二,由于統(tǒng)一的前綴,方便正則加載這些配置文件。

bean的XML配置創(chuàng)建

直接通過<bean id="" class=""></bean>來進行,這樣的前提是該類存在無參數(shù)的構(gòu)造方法(背后的原理就是通過反射實例化的)。這種方式是實際中最常使用的,當然,除此之外還存在靜態(tài)工廠、實例工廠的方式創(chuàng)建。

另外一點還需要注意的是:bean是單例的,還是多例的?

bean標簽中存在scope屬性用于說明:

singleton:單例,default

prototype:多例

request/session等。

bean的屬性注入:XML方式

bean的XML創(chuàng)建是通過反射進行,那么bean的屬性注入,是如何進行的呢?

可以在構(gòu)造bean的時候,提供有參數(shù)的構(gòu)造方法進行設(shè)置;

可以在提供setter方法,進行設(shè)置;(最常用)

什么接口注入,什么P名稱空間注入,這些實際都不用......

<bean id="" class="">

<property name="" value=""> 或者<property name="" ref="">

</bean>

要么利用value直接給出屬性值,要么通過ref引用另一個bean。

基于注解方式的bean創(chuàng)建以及注入

因為Spring注解的實現(xiàn)是需要AOP的支持,因此在依賴方面需要注意,其次,要在XML中開啟注解掃描:

<context:component-scan base-package="" />

實際上這個配置,會讓Spring在指定包下掃描,把帶有注解標志的bean實例化,并且會進行屬性注入。(你可以參考《寫出我的第一個框架:迷你版Spring MVC》

創(chuàng)建對象的4個注解:

@Component/@Controller/@Service/@Repository

在這4個注解上,通過value屬性來指定bean的id,通過@scope配合來聲明單例OR多例。(目前這4個注解功能是一樣的,只是為了讓標注類的用途更加清晰,而且Spring留了一手,以后說不定會增強功能呢?)

如何注入屬性?

@Autowired/@Resource/@Qualifier

需要注意的是@Resource是javax包下的,說白了就是J2EE提供的;而@Autowired是Spring提供的。(不必提供setter方法

@Resource默認按照名稱注入,如果找不到才按照類型注入。

@Autowired默認按照類型注入,可以結(jié)合@Qualifier進行名稱注入。

那么我們需要注意什么呢?

如果@Autowired進行類型注入,很可能類型會有多個滿足(多態(tài)),那么到底注入哪個呢?所以說,如果按照@Autowired類型注入,一定注意這點,結(jié)合@Qualifier。實際開發(fā)中,顯然,注入應(yīng)該是確定的,那么按照名稱注入,應(yīng)該是首選!

IOC VS DI

IOC,控制反轉(zhuǎn);DI,依賴注入;

只有把對象交給Spring,才能由Spring幫助完成屬性設(shè)置;因此,依賴注入不能單獨存在,需要在IOC基礎(chǔ)之上完成操作。

關(guān)于AOP

AOP的實現(xiàn),一種橫向抽取機制,依賴于動態(tài)代理模式。

關(guān)于AOP的幾個重點概念:

JoinPoint:連接點,說白了,就是可以被增強的方法;

PointCut:切入點,對哪些JoinPoint進行攔截;

Advice:通知,就是攔截后的動作;

Aspect:切面,把增強應(yīng)用到具體方法的過程;

Spring的AOP需要借助aspectj來實現(xiàn),可以通過XML,也可以通過注解來完成。

比如,采用XML方式的話,需要指明用A類的哪個方法對B類的哪些方法上進行增強,這里就涉及到execution表達式了;

比如,采用注解方式的話,就更加簡單了,先在XML中開啟AOP(<aop:aspectj-autoproxy />),然后在增強方法上直接使用類似@Before(value="execution(具體的表達式)")即可;

其實,在實際開發(fā)中,我們對于AOP最常用的就是事務(wù)了。

Spring的事務(wù)管理

Spring的聲明式事務(wù)管理,用的最多的就是基于注解的方式。首先我們得配置一個事務(wù)管理器,而事務(wù)管理器需要我們注入DataSource(DBCP,c3p0等連接池),這一點好理解,因為是DB的事務(wù)。要知道,Spring對不同的DAO層框架(Spring JDBC/MyBatis/Hibernate...)提供了不同的事務(wù)實現(xiàn)類。

我們可以看個例子:

對于多個數(shù)據(jù)源,當然,我們需要定義多個事務(wù)管理器,同時也得開啟事務(wù)注解。多個事務(wù)管理器,可以通過qualifier屬性進行區(qū)分。

配置完畢后,直接在service層的類或者方法上,使用

@Transactional(value = "gcs", rollbackFor = Exception.class)

Spring與web整合的原理

從操作上來講,就是在web.xml中去配置一個監(jiān)聽器,然后指定Spring的配置文件即可。

每一個WEB項目,都存在一個ServletContext對象,而我們配置的監(jiān)聽器就是對它進行監(jiān)聽,監(jiān)聽器會加載Spring的配置文件,把創(chuàng)建的對象放到ServletContext域(也就是setAttribute方法),獲取對象的時候直接getAttribute即可!

好了,到這里,Spring的梳理就結(jié)束了!

歡迎工作一到五年的Java工程師朋友們加入Java高并發(fā): 957734884,群內(nèi)提供免費的Java架構(gòu)學習資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 如果說有什么框架是Java程序員必然會學習、使用到的,那么Spring肯定是其中之一。本篇博客,將根據(jù)博主在...
    91005a6a668c閱讀 226評論 0 1
  • 前言 如果說有什么框架是Java程序員必然會學習、使用到的,那么Spring肯定是其中之一。本篇博客,將根據(jù)博主在...
    張豐哲閱讀 6,007評論 19 118
  • 本文是我自己在秋招復習時的讀書筆記,整理的知識點,也是為了防止忘記,尊重勞動成果,轉(zhuǎn)載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 12,444評論 6 86
  • 本來是準備看一看Spring源碼的。然后在知乎上看到來一個帖子,說有一群**自己連Spring官方文檔都沒有完全讀...
    此魚不得水閱讀 7,044評論 4 21
  • 從前有一個想當英雄的小男孩,有一次睡覺的時候,夢見一個騎士在跟他說話,騎士說:“請問我能要你幫個忙嗎?”小男...
    鄭笑朗閱讀 445評論 0 0

友情鏈接更多精彩內(nèi)容