国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring學(xué)習(xí)教程之AOP模塊的概述

Spring學(xué)習(xí)教程之AOP模塊的概述

2021-04-26 14:33張濤 Java教程

AOP 從功能的角度來(lái)講,可能看作OOP編程方式的一種補(bǔ)充,提供了一種不同的代碼或者系統(tǒng)組織方式,下面這篇文章主要給大家介紹了關(guān)于Spring學(xué)習(xí)教程之AOP模塊的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下

概述

spirng-aop模塊是spring框架中的核心模塊,雖然spring ioc container并不依賴aop,但aop給ioc的實(shí)現(xiàn)提供了一種強(qiáng)大而靈活的解決方案。

在spring framework中,aop主要是用于兩種目的:

  • 提供一些 企業(yè) 級(jí)的聲明式服務(wù),典型的應(yīng)用如 declarative transaction management .
  • 允許用戶實(shí)現(xiàn)自己的aspects,用aop的方式來(lái)幫助和補(bǔ)充oop的功能及實(shí)現(xiàn)

aop從功能的角度來(lái)講,可能看作oop編程方式的一種補(bǔ)充,提供了一種不同的代碼或者系統(tǒng)組織方式。oop中的核心概念是class,而在aop中則是aspect。

spirng-aop模塊是spring框架中的核心模塊,雖然spring ioc container并不依賴aop,但aop給ioc的實(shí)現(xiàn)提供了一種強(qiáng)大而靈活的解決方案。

在spring framework中,aop主要是用于兩種目的:

  • 提供一些企業(yè)級(jí)的聲明式服務(wù),典型的應(yīng)用如 declarative transaction management.
  • 允許用戶實(shí)現(xiàn)自己的aspects,用aop的方式來(lái)幫助和補(bǔ)充oop的功能及實(shí)現(xiàn)

spring aop由純java實(shí)現(xiàn),無(wú)須特殊的編譯處理,也不需要控制類加載器的層次結(jié)構(gòu),所以它可以適用于servlet container和其它application server.

spring aop目前只支持方法級(jí)別的切換或攔截,屬性的攔截現(xiàn)在不支持,如果想要攔截屬性,可以考慮使用aspectj語(yǔ)言。
spring aop的使用不同于其它大多數(shù)aop框架。它的主要目的不是提供一套大而全的aop實(shí)現(xiàn),而是集成aop不同實(shí)現(xiàn)協(xié)同spring ioc來(lái)幫助解決一些普遍性問(wèn)題。

需要注意的是,一些細(xì)粒度的advised(如domain model),spring aop往往不能提供很好的支持,這場(chǎng)景也還是考慮aspectj。即使如此,就普遍經(jīng)驗(yàn)來(lái)說(shuō)spring aop的強(qiáng)大機(jī)制依然能夠解決大多數(shù)場(chǎng)景的問(wèn)題。
那么該如何看待spring aop和aspectj,引用spring官方文檔的原文:

spring aop will never strive to compete with aspectj to provide a comprehensive aop solution. we believe that both proxy-based frameworks like spring aop and full-blown frameworks such as aspectj are valuable, and that they are complementary, rather than in competition. spring seamlessly integrates spring aop and ioc with aspectj, to enable all uses of aop to be catered for within a consistent spring-based application architecture. this integration does not affect the spring aop api or the aop alliance api: spring aop remains backward-compatible.

在spring框架所有的模塊設(shè)計(jì)中,始終遵守的核心信條之一是——無(wú)侵入性。

所以在使用spring aop時(shí),不會(huì)強(qiáng)制我們?cè)跇I(yè)務(wù)代碼中引入特定類或者接口,可以最大限度的保持代碼 clean and decouple。然而spring也提供了另一種選擇,如果有特定的場(chǎng)景需要的話,你可以在你的代碼中直接引入spring aop。幾乎所有spring框架中的模塊,在使用的方式上都會(huì)給你多種選擇,以便讓用戶選擇更適合自己場(chǎng)景的方式。使用aspectj還是spring aop,使用annotation方式還是xml的配置方式,depends on u。

了解了spring aop的初衷和使用場(chǎng)景,來(lái)看下它的大致實(shí)現(xiàn)原理

在軟件世界中的絕大多數(shù)問(wèn)題,都可以通過(guò)加一層來(lái)解決。

這里所說(shuō)的層,當(dāng)然是廣義上的,可以是一層抽象,也可以是一層cache,大致含義是隔離和解耦的范疇。

在spring的世界里,每一個(gè)模塊的引入,或者第三方技術(shù)的集成,總會(huì)提供一個(gè)抽象層 ,對(duì)用戶提供統(tǒng)一的api,屏蔽了所有的實(shí)現(xiàn)細(xì)節(jié)以及不同實(shí)現(xiàn)的差異。例如spring-cache,spring-jdbc,spring-jms以及spirng-messaging等模塊都提供了一層抽象。

spring aop的實(shí)現(xiàn)是基于代理的機(jī)制,默認(rèn)是采用jdk dynamic proxy,也可以采用cglib的proxy。兩者的區(qū)別主要是在于被代理的對(duì)象的不同。當(dāng)目標(biāo)對(duì)象是接口時(shí),jdk dynamic proxy可以完成代理,但目標(biāo)對(duì)象是沒(méi)有實(shí)現(xiàn)接口的類時(shí)(盡量少一些,面向接口編程是好習(xí)慣),是需要采用cglib proxy來(lái)完成代理的,當(dāng)然你也可以強(qiáng)制接口也采用cglib來(lái)代理;另外需要注入或引用具體類型時(shí),如果引用的東西恰恰是代理過(guò)的對(duì)象,此時(shí)也需要采用cglib的方式。

功能設(shè)計(jì)和實(shí)現(xiàn)上來(lái)可以分為兩大塊

  • aop基礎(chǔ)設(shè)施的創(chuàng)建,可以看作是aopproxy的生成
  • aopproxy對(duì)象的調(diào)用時(shí)的處理攔截,即處理對(duì)目標(biāo)對(duì)象的攔截器

aop的創(chuàng)建

生成代理對(duì)象的核心類,proxyfactorybean getobjecct()

下圖是生成代理時(shí),是用jdk還是cglib的選擇邏輯:

Spring學(xué)習(xí)教程之AOP模塊的概述

找到了生成代理的具體執(zhí)行者,那么這個(gè)操作是在什么時(shí)候被調(diào)用的呢,了解過(guò)spring bean生命周期的都應(yīng)該知道,bean在創(chuàng)建的時(shí)候,有一系列的回調(diào)接口供用戶插入自定義的行為,來(lái)左右bean的一些特性,其中beanpostprocessor是接口中的一種。以往的文章有介紹過(guò)(玩轉(zhuǎn)spring bean的終極利器)。而spring aop正是利用這個(gè)契機(jī),在創(chuàng)建bean的過(guò)程中插了一手,如果正在創(chuàng)建的bean是我們aop的target,則創(chuàng)建代理,并最終把代理對(duì)象返回給ioc。

abstractautoproxycreator 這個(gè)類是一個(gè)beanpostprocessor的實(shí)現(xiàn),用來(lái)創(chuàng)建代理,來(lái)看這個(gè)處理器的后處理方法,最終是返回了createproxy()方法返回的代理

Spring學(xué)習(xí)教程之AOP模塊的概述

aop切面的增強(qiáng)的執(zhí)行

可以理解成對(duì)目標(biāo)對(duì)象上所有攔截器鏈的調(diào)用

由于spring aop的代理具體實(shí)現(xiàn)有兩種,jdk dynamic proxy和cglib,所以執(zhí)行攔截器的方式有所不同,具體可以閱讀源碼jdkdynamicaopproxy類的invoke方法

Spring學(xué)習(xí)教程之AOP模塊的概述

對(duì)目標(biāo)方法的調(diào)用最終是依靠reflectivemethodinvocation.

reflectivemethodinvocation中的proceed處理是采用遞歸的方式處理攔截器鏈

Spring學(xué)習(xí)教程之AOP模塊的概述

cglibaopproxy的 intercept方法

Spring學(xué)習(xí)教程之AOP模塊的概述

cglibmethodinvoation是繼承了reflectivemethodinvocation,處理攔截器鏈也是用的上邊的proceed()方法。

在使用spring aop時(shí)需要注意的兩點(diǎn)細(xì)節(jié):

1、在類內(nèi)部的方法調(diào)用時(shí)(self-invoke),spring aop不起作用,原因是內(nèi)部調(diào)用沒(méi)通過(guò)代理對(duì)象,直接使用的目標(biāo)對(duì)象。解決方法有:

  • 重構(gòu)代碼,避免內(nèi)部調(diào)用
  • aopcontext.currentproxy()
  • 或者干脆使用aspectj語(yǔ)言吧...

2、在注入bean時(shí),如果想注入bean的具體的類型而不是接口,那么采用cglib吧

spring aop的功能很強(qiáng)大,設(shè)計(jì)巧妙,這里梳理了主要脈絡(luò),細(xì)節(jié)不再一一討論。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://mp.weixin.qq.com/s/XkSpuDCrx3nWSOBhQqAm9g

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: av在线视 | 一区在线视频 | 色亚洲成人| 欧美日韩中文字幕在线 | 91免费观看 | 午夜爱| 久久精品xx老女人老配少 | 国产精品成人3p一区二区三区 | 久久男人的天堂 | 国产日产久久高清欧美一区 | 日本人在线观看 | 久久久久久久久久久久久久免费看 | 国产精品久久久久久久久久新婚 | 黑人av| 99久久精品一区二区成人 | 久久精品国产精品青草 | 国产精品久久久久久久久久免费看 | 国产精品99久久久久久动医院 | 欧美 日韩 中文 | 红桃av一区二区 | 国产欧美自拍 | 国产综合久久久 | 精品无码久久久久久国产 | 久久日韩 | 久草免费在线视频 | 九九热免费精品视频 | 亚洲国产婷婷香蕉久久久久久99 | 国产99久久精品一区二区永久免费 | 日韩中文字幕一区二区 | 久久久亚洲精品视频 | 亚洲成人xxx | 久久蜜桃av一区二区天堂 | 免费成人高清在线视频 | 一区二区在线不卡 | 国产一区二区三区在线观看视频 | 午夜小视频在线观看 | 亚洲精品国产电影 | 中文日韩av| 久久久久久久成人 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲欧美日韩一区 |