Spring復(fù)習(xí)筆記-第一天
介紹Spring:
????????首先說(shuō)一下Spring并不是一個(gè)針對(duì)于某些開(kāi)發(fā)功能的框架,Spring倡導(dǎo)的是針對(duì)于Java的設(shè)計(jì)模式,可以理解為Spring只是一個(gè)為我們提供工具的Jar包,在調(diào)用這個(gè)Jar包時(shí)會(huì)體現(xiàn)到下文所介紹的設(shè)計(jì)思想,通過(guò)這個(gè)設(shè)計(jì)思想可以為后續(xù)的Springboot以及Springcloud提供基礎(chǔ)的開(kāi)發(fā)思路。

壹、Spring
????????作為一個(gè)已經(jīng)爛大街的框架,Spring的內(nèi)部思想其實(shí)并沒(méi)有那么復(fù)雜。針對(duì)于初學(xué)者來(lái)說(shuō),Spring難點(diǎn)其實(shí)也只是編程思想的切換。大部分人從開(kāi)始的使用面向?qū)ο蟮恼Z(yǔ)言做著面向過(guò)程的開(kāi)發(fā),轉(zhuǎn)換為真正面向?qū)ο缶褪菑腟pring開(kāi)始了解的。像Spring中的賦值其實(shí)也就只是底層封裝了IO讀取xml文件、解析然后通過(guò)反射機(jī)制為對(duì)象進(jìn)行值插入。

貳、IOC與DI
????????說(shuō)到編程思想就不得不提Spring中倡導(dǎo)我們使用的思想IOC/DI,IOC說(shuō)的是轉(zhuǎn)換了新建對(duì)象的控制權(quán)力,在JavaEE的學(xué)習(xí)中又或是日常的代碼編寫(xiě)中,我們習(xí)慣了new對(duì)象的方法去創(chuàng)建一個(gè)對(duì)象,但是在Spring中,Spring倡導(dǎo)我們通過(guò)配置、注解的方式實(shí)現(xiàn)一個(gè)對(duì)象的創(chuàng)建。底層原理可以理解為Spring容器中含有一個(gè)對(duì)象管理器,針對(duì)于這個(gè)對(duì)象管理器Spring為我們編寫(xiě)了一套通用的class管理,就像我們?cè)诜瓷渲袑W(xué)習(xí)到的如何通過(guò)類(lèi)名去創(chuàng)建一個(gè)對(duì)象。實(shí)質(zhì)上ClassPathXmlApplicationContext就是做了這個(gè)操作,通過(guò)檢測(cè)(包名.類(lèi)名)的方式拿到一個(gè)Object的對(duì)象再通過(guò)指向拿到一個(gè)類(lèi)并調(diào)用它的無(wú)參構(gòu)造方法,這也是我們?cè)貯pplication.getBean中獲取到的對(duì)象為什么是Object的原因。再通過(guò)我們手動(dòng)指定強(qiáng)轉(zhuǎn)的方式拿到這個(gè)Bean對(duì)象。對(duì)于DI來(lái)說(shuō)我們?cè)貯類(lèi)中需要調(diào)用B類(lèi)使用,那么由于我們將控制權(quán)限(就是new對(duì)象的權(quán)力)移交給了Spring,那么我們不能手動(dòng)創(chuàng)建B類(lèi)這個(gè)時(shí)候DI的作用就顯現(xiàn)了出來(lái)。針對(duì)于A類(lèi)中聲明的B類(lèi)包含,Spring容器會(huì)自動(dòng)為我們創(chuàng)建一個(gè)B類(lèi)。這也就是為什么你使用懶加載的時(shí)候A類(lèi)創(chuàng)建了B類(lèi)也會(huì)一起創(chuàng)建的原因。但是單例和C類(lèi)引發(fā)的循環(huán)依賴(lài)在這里并不能解決。

叁、Bean
????????Spring中對(duì)象的簡(jiǎn)稱(chēng),也可以稱(chēng)之為組件。再一個(gè)組件中,如果我們想使用它,不可以直接new而是通過(guò)(xml去配置一個(gè)這樣的組件)或(@Bean注解聲明的類(lèi))。


肆、Spring中注解的使用
1)@Component:可以使用此注解描述 Spring 中的 Bean,但它是一個(gè)泛化的概念,僅僅表示一個(gè)組件(Bean),并且可以作用在任何層次。
2)@Repository:用于將數(shù)據(jù)訪(fǎng)問(wèn)層(DAO層),作用與@Component相同。
3)@Service:通常作用在業(yè)務(wù)層(Service 層),作用與@Component相同。
4)@Controller:通常作用在控制層(Controller層)作用與@Component相同。
5)@Autowired:用于對(duì) Bean 的屬性變量、屬性的 Set 方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,配合對(duì)應(yīng)的注解處理器完成 Bean 的自動(dòng)配置工作。默認(rèn)按照 Bean 的類(lèi)型進(jìn)行裝配。
6)@Resource:其作用與 Autowired 一樣。其區(qū)別在于 @Autowired 默認(rèn)按照 Bean 類(lèi)型裝配,而 @Resource 默認(rèn)按照 Bean 實(shí)例名稱(chēng)進(jìn)行裝配。@Resource 中有兩個(gè)重要屬性:name 和 type。Spring 將 name 屬性解析為 Bean 實(shí)例名稱(chēng),type 屬性解析為 Bean 實(shí)例類(lèi)型。如果指定 name 屬性,則按實(shí)例名稱(chēng)進(jìn)行裝配;如果指定 type 屬性,則按 Bean 類(lèi)型進(jìn)行裝配。如果都不指定,則先按 Bean 實(shí)例名稱(chēng)裝配,如果不能匹配,則再按照 Bean 類(lèi)型進(jìn)行裝配;如果都無(wú)法匹配,則拋出 NoSuchBeanDefinitionException 異常。
7)@Qualifier:與 @Autowired 注解配合使用,會(huì)將默認(rèn)的按 Bean 類(lèi)型裝配修改為按 Bean 的實(shí)例名稱(chēng)裝配,Bean 的實(shí)例名稱(chēng)由 @Qualifier 注解的參數(shù)指定。

伍、Bean的屬性配置
1)xml配置方式:
<bean id="xxx" class="com.test">
????<property name="xxx" value="xxx"></property>
</bean>
2)注解方式:

陸、AOP
????????AOP 要達(dá)到的效果是,保證開(kāi)發(fā)者不修改源代碼的前提下,去為系統(tǒng)中的業(yè)務(wù)組件添加某種通用功能。AOP 的本質(zhì)是由 AOP 框架修改業(yè)務(wù)組件的多個(gè)方法的源代碼,看到這其實(shí)應(yīng)該明白了,AOP 其實(shí)就是前面一篇文章講的代理模式的典型應(yīng)用。
按照 AOP 框架修改源代碼的時(shí)機(jī),可以將其分為兩類(lèi):
1)靜態(tài) AOP 實(shí)現(xiàn), AOP 框架在編譯階段對(duì)程序源代碼進(jìn)行修改,生成了靜態(tài)的 AOP 代理類(lèi)(生成的 *.class 文件已經(jīng)被改掉了,需要使用特定的編譯器),比如 AspectJ。
2)動(dòng)態(tài) AOP 實(shí)現(xiàn), AOP 框架在運(yùn)行階段對(duì)動(dòng)態(tài)生成代理對(duì)象(在內(nèi)存中以 JDK 動(dòng)態(tài)代理,或 CGlib 動(dòng)態(tài)地生成 AOP 代理類(lèi)),如 SpringAOP。
AOP 領(lǐng)域中的特性術(shù)語(yǔ):
1)通知(Advice): AOP 框架中的增強(qiáng)處理。通知描述了切面何時(shí)執(zhí)行以及如何執(zhí)行增強(qiáng)處理。
2)連接點(diǎn)(join point): 連接點(diǎn)表示應(yīng)用執(zhí)行過(guò)程中能夠插入切面的一個(gè)點(diǎn),這個(gè)點(diǎn)可以是方法的調(diào)用、異常的拋出。在 Spring AOP 中,連接點(diǎn)總是方法的調(diào)用。
3)切點(diǎn)(PointCut): 可以插入增強(qiáng)處理的連接點(diǎn)。
4)切面(Aspect): 切面是通知和切點(diǎn)的結(jié)合。
5)引入(Introduction):引入允許我們向現(xiàn)有的類(lèi)添加新的方法或者屬性。
6)織入(Weaving): 將增強(qiáng)處理添加到目標(biāo)對(duì)象中,并創(chuàng)建一個(gè)被增強(qiáng)的對(duì)象,這個(gè)過(guò)程就是織入。

結(jié)束:第一天主要介紹了Spring是如何使用的,以及Bean相關(guān)的配置信息,同時(shí)還有IOC/DI、AOP的基礎(chǔ)知識(shí)。明天會(huì)針對(duì)于Bean進(jìn)行一個(gè)實(shí)現(xiàn)。