日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

4种实例 advice aop_《Spring实战》阅读笔记

發(fā)布時(shí)間:2023/12/15 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4种实例 advice aop_《Spring实战》阅读笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡化 Java 開發(fā)

為了降低 Java 開發(fā)的復(fù)雜性, Spring 采取了以下 4 種關(guān)鍵策略:基于POJO (Plain Old Java object) 的輕量級(jí)和最小侵入性編程

通過依賴注入和面向接口實(shí)現(xiàn)松耦合

基于切面和慣例進(jìn)行聲明式編程

通過切面和模板減少樣板式代碼

依賴注入 (DI)

傳統(tǒng)做法下,每個(gè)對(duì)象負(fù)責(zé)管理與自己所依賴的對(duì)象的引用,這樣會(huì)導(dǎo)致高耦合。

通過依賴注入,對(duì)象的依賴關(guān)系將由一個(gè)第三方組件在創(chuàng)建對(duì)象時(shí)進(jìn)行自動(dòng)注入,對(duì)象無需管理它們的依賴關(guān)系。

依賴注入的實(shí)現(xiàn)方式:構(gòu)造器注入:在構(gòu)造方法中將依賴對(duì)象作為參數(shù)傳入

XML

注解

Spring 通過 Application Context 裝載 bean 的定義并負(fù)責(zé)對(duì)象的創(chuàng)建與組裝。

面向切面編程 (AOP)

AOP 允許將遍布應(yīng)用各處的重復(fù)功能,分離出來形成可重用的組件。

Spring 提供了 4 種類型的 AOP 支持:基于代理的經(jīng)典 Spring AOP

純 POJO切 面

@AspectJ 注解驅(qū)動(dòng)的切面

注入式 AspectJ 切面(適用于 Spring 各版本)

Weaving (織入)

織入是把切面應(yīng)用到目標(biāo)對(duì)象并創(chuàng)建新的代理對(duì)象的過程。在目標(biāo)對(duì)象的生命周期里有多個(gè)點(diǎn)

可以進(jìn)行織入:編譯期:切面在目標(biāo)類編譯時(shí)被織入。這種方式需要特殊的編譯器。AspectJ的織入編譯器就是以這種方式織入切面的。

類加載期:切面在目標(biāo)類加載到JVM時(shí)被織入。這種方式需要特殊的類加載器(ClassLoader),它可以在目標(biāo)類被引入應(yīng)用之前增強(qiáng)該目標(biāo)類的字節(jié)碼。AspectJ 5的加載時(shí)織入(load-time

weaving,LTW)就支持以這種方式織入切面。

運(yùn)行期:切面在應(yīng)用運(yùn)行的某個(gè)時(shí)刻被織入。一般情況下,在織入切面時(shí),AOP容器會(huì)為目標(biāo)對(duì)象動(dòng)態(tài)地創(chuàng)建一個(gè)代理對(duì)象。Spring AOP就是以這種方式織入切面的。

Aspect (切面)

切面是 Advice 和 Pointcut 的結(jié)合。通知和切點(diǎn)共同定義了切面的全部內(nèi)容——它是什么,在何時(shí)和何處完成其功能。

Advice (通知)

即切面的具體工作,Advice定義了切面是什么以及何時(shí)使用。除了描述切面要完成的工作,

通知還解決了何時(shí)執(zhí)行這個(gè)工作的問題。

Spring 中的 AOP 定義了以下5種 Advice:前置通知(Before):在目標(biāo)方法被調(diào)用之前調(diào)用通知功能

后置通知(After):在目標(biāo)方法完成之后調(diào)用通知,此時(shí)不會(huì)關(guān)心方法的輸出是什么

返回通知(After-returning):在目標(biāo)方法成功執(zhí)行之后調(diào)用通知

異常通知(After-throwing):在目標(biāo)方法拋出異常后調(diào)用通知

環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知的方法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為

Joint point (連接點(diǎn))

連接點(diǎn)是在應(yīng)用執(zhí)行過程中能夠插入切面的一個(gè)點(diǎn)。

這個(gè)點(diǎn)可以是調(diào)用方法時(shí)、拋出異常時(shí)、甚至修改一個(gè)字段時(shí)。切面代碼可以利用這些點(diǎn)插入到應(yīng)用的正常流程之中,并添加新的行為。

Spring 只支持方法級(jí)別的 Joint point。

Pointcut (切點(diǎn))

如果說 Advice 定義了切面的“什么”和“何時(shí)”的話,那么 Pointcut 就定義了“何處”。

切點(diǎn)的定義會(huì)匹配通知所要織入的一個(gè)或多個(gè) Joint point。通常使用明確的類和方法名稱,或是利用正則表達(dá)式定義所匹配的類和方法名稱來指定這些切點(diǎn)。

有些 AOP 框架還允許創(chuàng)建動(dòng)態(tài)的切點(diǎn)。

Spring 容器

Spring 容器負(fù)責(zé)創(chuàng)建、裝配與配置對(duì)象,并管理對(duì)象的整個(gè)生命周期(從 new 到 finalize( ))。

Spring 自帶了不同類型的容器實(shí)現(xiàn);Bean工廠,是最簡單的容器,提供基本DI支持。

應(yīng)用上下文 (Application Context),基于BeanFactory構(gòu)建,提供面向應(yīng)用的服務(wù),例如,解析屬性文本信息內(nèi)容。

Application Context

Spring 自帶了多種 Application Context 的實(shí)現(xiàn),區(qū)別僅在于如何加載配置。AnnotationConfigApplicationContext:從一個(gè)或多個(gè)基于 Java 的配置類中加載 Spring 應(yīng)用上下文。

ClassPathXmlApplicationContext:從一個(gè)或多個(gè)基于 Java 的配置類中加載 Spring Web 應(yīng)用上下文。

FileSystemXmlApplicationContext:從類路徑下的一個(gè)或多個(gè) XML 配置文件中加載上下文定義,把應(yīng)用上下文的定義文件作為類資源。

XmlWebApplicationContext:從 Web 應(yīng)用下的一個(gè)或多個(gè) XML 配置文件中加載上下文定義。

Bean 的生命周期

Spring對(duì)bean進(jìn)行實(shí)例化;

Spring將值和bean的引用注入到bean對(duì)應(yīng)的屬性中;

如果bean實(shí)現(xiàn)了BeanNameAware接口,Spring將bean的ID傳遞給setBean-Name()方法;

如果bean實(shí)現(xiàn)了BeanFactoryAware接口,Spring將調(diào)用setBeanFactory()方法,將BeanFactory容器實(shí)例傳入;

如果bean實(shí)現(xiàn)了ApplicationContextAware接口,Spring將調(diào)用setApplicationContext()方法,將bean所在的應(yīng)用上下文的引用傳入進(jìn)來;

如果bean實(shí)現(xiàn)了BeanPostProcessor接口,Spring將調(diào)用它們的post-ProcessBeforeInitialization()方法;

如果bean實(shí)現(xiàn)了InitializingBean接口,Spring將調(diào)用它們的after-PropertiesSet()方法。類似地,如果bean使用initmethod聲明了初始化方法,該方法也會(huì)被調(diào)用;

如果bean實(shí)現(xiàn)了BeanPostProcessor接口,Spring將調(diào)用它們的post-ProcessAfterInitialization()方法;

此時(shí),bean已經(jīng)準(zhǔn)備就緒,可以被應(yīng)用程序使用了,它們將一直駐留在應(yīng)用上下文中,直到該應(yīng)用上下文被銷毀;

10.如果bean實(shí)現(xiàn)了DisposableBean接口,Spring將調(diào)用它的destroy()接口方法。同樣,如果bean使用destroy-method聲明了銷毀方法,該方法也會(huì)被調(diào)用。

Spring 中的 Bean

Spring 中提供了三種主要的裝配機(jī)制:在XML中進(jìn)行顯式配置。

在Java中進(jìn)行顯式配置。

隱式的 bean 發(fā)現(xiàn)機(jī)制和自動(dòng)裝配

其中自動(dòng)裝配是通過以下兩種方式來實(shí)現(xiàn)的:組件掃描(component scanning):Spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文

中所創(chuàng)建的bean。

自動(dòng)裝配(autowiring):Spring自動(dòng)滿足bean之間的依賴。

聲明 Bean

使用@Component注解,解表明該類會(huì)作為組件類,并告知Spring要為這個(gè)類創(chuàng)建 bean。

然后使用@ComponentScan注解開啟組件掃描,默認(rèn)情況下它將以配置類所在的package作為base package來掃描組件。

消除 Autowired 的歧義性

通過 @Primary 配置首選自動(dòng)裝配的 bean 或通過 @Qualifier 來限定自動(dòng)裝配的 bean。

Bean 的作用域

默認(rèn)情況下,Spring ApplicationContext 中所有 bean 都是作為單例的形式創(chuàng)建的。

通過 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 注解可以設(shè)置其他的作用域,或者是@Scope('prototype'),但是用 SCOPE_PROTOTYPE 常量更加安全不易出錯(cuò)。

Spring 定義了多種作用域,可以基于這些作用域創(chuàng)建 bean,包括:單例(Singleton):在整個(gè)應(yīng)用中,只創(chuàng)建 bean 的一個(gè)實(shí)例。

原型(Prototype):每次注入或者通過 Spring ApplicationContext 獲取的時(shí)候,都會(huì)創(chuàng)建一個(gè)新的 bean 實(shí)例。

會(huì)話(Session):在 Web 應(yīng)用中,為每個(gè)會(huì)話創(chuàng)建一個(gè) bean 實(shí)例。

請(qǐng)求(Request):在 Web 應(yīng)用中,為每個(gè)請(qǐng)求創(chuàng)建一個(gè) bean 實(shí)例。

會(huì)話作用域與請(qǐng)求作用域

設(shè)想一個(gè)電商場景中的一個(gè) bean 代表用戶的購物車,如果這個(gè) bean 是單例的,那么所有用戶都會(huì)向同個(gè)購物車中添加商品,如果是原型的,在應(yīng)用中某個(gè)地方添加了商品,在另一個(gè)地方可能就拿不到了。在這個(gè)場景下,會(huì)話作用域是最為合適的。

使用會(huì)話作用域:1

2

3

4

5

6

7@Scope(value = WebApplicationContext.SCOPE_SESSION,

proxyMode = ScopedProxyMode.INTERFACES)

public ShoppingCart (){

...

}

注意一點(diǎn),@Scope注解同時(shí)還有一個(gè)proxyMode屬性,這個(gè)屬性解決了將會(huì)話或請(qǐng)求作用域的bean注入到單例bean中所遇到的問題。

如果將一個(gè)會(huì)話作用域的bean注入到一個(gè)單例bean中,只有某個(gè)用戶發(fā)起會(huì)員,這個(gè)單例bean才會(huì)被注入依賴的會(huì)話作用域bean。當(dāng)注入時(shí),Spring 并不會(huì)將實(shí)際的會(huì)話作用域bean注入到單例bean中,而是注入到單例bean的代理,如下圖所示。

這個(gè)代理會(huì)暴露與會(huì)話作用域bean相同的方法,當(dāng)單例bean調(diào)用會(huì)話作用域bean的方法時(shí),代理會(huì)對(duì)其進(jìn)行懶解析并將調(diào)用委托給對(duì)應(yīng)的會(huì)話作用域bean。

上面的proxyMode屬性被設(shè)置成了ScopedProxyMode.INTERFACES,這表明這個(gè)代理要實(shí)現(xiàn)接口,并將調(diào)用委托給實(shí)現(xiàn)bean。如果對(duì)應(yīng)的bean不是接口而是類的話,則需要設(shè)置為ScopedProxyMode.TARGET_CLASS。

總結(jié)

以上是生活随笔為你收集整理的4种实例 advice aop_《Spring实战》阅读笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。