一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務(wù)器之家 - 編程語言 - Java教程 - Java AOP知識(shí)詳細(xì)介紹

Java AOP知識(shí)詳細(xì)介紹

2020-07-28 14:15java教程網(wǎng) Java教程

這篇文章主要介紹了Java AOP知識(shí)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下

Java AOP

AOP知識(shí)整理

AOP(Aspect-Oriented Programming):面向切面的編程。OOP(Object-Oriented Programming)面向?qū)ο蟮木幊獭?duì)于OOP我們已經(jīng)再熟悉不過了,對(duì)于AOP,可能我們會(huì)覺得是一種新特性,其實(shí)AOP是對(duì)OOP的一種補(bǔ)充,OOP面向的是縱向編程,繼承、封裝、多態(tài)是其三大特性,而AOP是面向橫向的編程。

面向切面編程(AOP)通過提供另外一種思考程序結(jié)構(gòu)的途經(jīng)來彌補(bǔ)面向?qū)ο缶幊蹋∣OP)的不足。在OOP中模塊化的關(guān)鍵單元是類(classes),而在AOP中模塊化的單元?jiǎng)t是切面。切面能對(duì)關(guān)注點(diǎn)進(jìn)行模塊化,例如橫切多個(gè)類型和對(duì)象的事務(wù)管理。
AOP框架是spring的一個(gè)重要組成部分。但是Spring IoC容器并不依賴于AOP,這意味著你有權(quán)利選擇是否使用AOP,AOP做為Spring IoC容器的一個(gè)補(bǔ)充,使它成為一個(gè)強(qiáng)大的中間件解決方案。

AOP在Spring Framework中的作用

  • 提供聲明式企業(yè)服務(wù),特別是為了替代EJB聲明式服務(wù)。最重要的服務(wù)是聲明性事務(wù)管理(這個(gè)我想是AOP使用最多的一處了)。
  • 允許用戶實(shí)現(xiàn)自定義切面,用AOP來完善OOP的使用。

1.AOP概念:

學(xué)習(xí)AOP,當(dāng)然得先了解一下其眾多的概念性術(shù)語:

  • 切面(Aspect):一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象。事務(wù)管理是J2EE應(yīng)用中一個(gè)關(guān)于橫切關(guān)注點(diǎn)的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式來實(shí)現(xiàn)。
  • 連接點(diǎn)(Joinpoint):在程序執(zhí)行過程中某個(gè)特定的點(diǎn),比如某方法調(diào)用的時(shí)候或者處理異常的時(shí)候。在Spring AOP中,一個(gè)連接點(diǎn)總是表示一個(gè)方法的執(zhí)行。
  • 通知(Advice):在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。其中包括了“around”、“before”和“after”等不同類型的通知(通知的類型將在后面部分進(jìn)行討論)。許多AOP框架(包括Spring)都是以攔截器做通知模型,并維護(hù)一個(gè)以連接點(diǎn)為中心的攔截器鏈。
  • 切入點(diǎn)(Pointcut):匹配連接點(diǎn)的斷言。通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián),并在滿足這個(gè)切入點(diǎn)的連接點(diǎn)上運(yùn)行(例如,當(dāng)執(zhí)行某個(gè)特定名稱的方法時(shí))。切入點(diǎn)表達(dá)式如何和連接點(diǎn)匹配是AOP的核心:Spring缺省使用AspectJ切入點(diǎn)語法。
  • 引入(Introduction):用來給一個(gè)類型聲明額外的方法或?qū)傩裕ㄒ脖环Q為連接類型聲明(inter-type declaration))。Spring允許引入新的接口(以及一個(gè)對(duì)應(yīng)的實(shí)現(xiàn))到任何被代理的對(duì)象。例如,你可以使用引入來使一個(gè)bean實(shí)現(xiàn)IsModified接口,以便簡(jiǎn)化緩存機(jī)制。
  • 目標(biāo)對(duì)象(Target Object): 被一個(gè)或者多個(gè)切面所通知的對(duì)象。也被稱做被通知(advised)對(duì)象。 既然Spring AOP是通過運(yùn)行時(shí)代理實(shí)現(xiàn)的,這個(gè)對(duì)象永遠(yuǎn)是一個(gè)被代理(proxied)對(duì)象。
  • AOP代理(AOP Proxy):AOP框架創(chuàng)建的對(duì)象,用來實(shí)現(xiàn)切面契約(例如通知方法執(zhí)行等等)。在Spring中,AOP代理可以是JDK動(dòng)態(tài)代理或者CGLIB代理。
  • 織入(Weaving):把切面連接到其它的應(yīng)用程序類型或者對(duì)象上,并創(chuàng)建一個(gè)被通知的對(duì)象。這些可以在編譯時(shí)(例如使用AspectJ編譯器),類加載時(shí)和運(yùn)行時(shí)完成。Spring和其他純Java AOP框架一樣,在運(yùn)行時(shí)完成織入。

通知類型:

  • 前置通知(Before advice):在某連接點(diǎn)之前執(zhí)行的通知,但這個(gè)通知不能阻止連接點(diǎn)之前的執(zhí)行流程(除非它拋出一個(gè)異常)。
  • 后置通知(After returning advice):在某連接點(diǎn)正常完成后執(zhí)行的通知:例如,一個(gè)方法沒有拋出任何異常,正常返回。
  • 異常通知(After throwing advice):在方法拋出異常退出時(shí)執(zhí)行的通知。
  • 最終通知(After (finally) advice):當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。
  • 環(huán)繞通知(Around Advice):包圍一個(gè)連接點(diǎn)的通知,如方法調(diào)用。這是最強(qiáng)大的一種通知類型。環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為。它也會(huì)選擇是否繼續(xù)執(zhí)行連接點(diǎn)或直接返回它自己的返回值或拋出異常來結(jié)束執(zhí)行。

環(huán)繞通知是最常用的通知類型。和AspectJ一樣,Spring提供所有類型的通知,我們推薦你使用盡可能簡(jiǎn)單的通知類型來實(shí)現(xiàn)需要的功能。例如,如果你只是需要一個(gè)方法的返回值來更新緩存,最好使用后置通知而不是環(huán)繞通知,盡管環(huán)繞通知也能完成同樣的事情。用最合適的通知類型可以使得編程模型變得簡(jiǎn)單,并且能夠避免很多潛在的錯(cuò)誤。比如,你不需要在JoinPoint上

調(diào)用用于環(huán)繞通知的proceed()方法,就不會(huì)有調(diào)用的問題。

在這里,基于@AspectJ的AOP我就不多寫了,因?yàn)槲腋嗖A于Spring中使用ProxyFactoryBean創(chuàng)建AOP代理。

2.使用ProxyFactoryBean創(chuàng)建AOP代理:

在Spring里創(chuàng)建一個(gè)AOP代理的基本方法是使用org.springframework.aop.framework.ProxyFactoryBean。 這個(gè)類對(duì)應(yīng)用的切入點(diǎn)和通知提供了完整的控制能力(包括它們的應(yīng)用順序)。像其它的FactoryBean實(shí)現(xiàn)一樣,ProxyFactoryBean引入了一個(gè)間接層。如果你定義一個(gè)名為foo的ProxyFactoryBean, 引用foo的對(duì)象看到的將不是ProxyFactoryBean實(shí)例本身,而是一個(gè)ProxyFactoryBean實(shí)現(xiàn)里getObject() 方法所創(chuàng)建的對(duì)象。 這個(gè)方法將創(chuàng)建一個(gè)AOP代理,它包裝了一個(gè)目標(biāo)對(duì)象。

ProxyFactoryBean類本身也是一個(gè)JavaBean,其屬性主要有如下用途:

  • 指定你希望代理的目標(biāo)對(duì)象
  • 指定是否使用CGLIB。

一些主要屬性從org.springframework.aop.framework.ProxyConfig里繼承下來(這個(gè)類是Spring里所有AOP代理工廠的父類)。這些主要屬性包括:

  • proxyTargetClass:這個(gè)屬性為true時(shí),目標(biāo)類本身被代理而不是目標(biāo)類的接口。如果這個(gè)屬性值被設(shè)為true,CGLIB代理將被創(chuàng)建。
  • optimize:用來控制通過CGLIB創(chuàng)建的代理是否使用激進(jìn)的優(yōu)化策略。 除非完全了解AOP代理如何處理優(yōu)化,否則不推薦用戶使用這個(gè)設(shè)置。目前這個(gè)屬性僅用于CGLIB代理; 對(duì)于JDK動(dòng)態(tài)代理(缺省代理)無效。
  • frozen:如果一個(gè)代理配置是frozen的,就不允許對(duì)該配置進(jìn)行修改。 這在簡(jiǎn)單優(yōu)化和不希望調(diào)用者在代理創(chuàng)建后操作代理(通過Advised接口) 時(shí)很有用。缺省值為false,即可以進(jìn)行類似添加附加通知的操作。
  • exposeProxy:決定當(dāng)前代理是否被暴露在一個(gè)ThreadLocal 中以便被目標(biāo)對(duì)象訪問。如果目標(biāo)對(duì)象需要獲取代理而且exposeProxy屬性被設(shè)為 true,目標(biāo)對(duì)象可以使用AopContext.currentProxy()方法。
  • aopProxyFactory:使用AopProxyFactory的實(shí)現(xiàn)。這提供了一種方法來自定義是否使用動(dòng)態(tài)代理,CGLIB或其它代理策略。 缺省實(shí)現(xiàn)將根據(jù)情況選擇動(dòng)態(tài)代理或者CGLIB。一般情況下應(yīng)該沒有使用這個(gè)屬性的需要;它是被設(shè)計(jì)來在Spring 1.1中添加新的代理類型的。

ProxyFactoryBean中需要說明的其它屬性包括:

  • proxyInterfaces:需要代理的接口名的字符串?dāng)?shù)組。 如果沒有提供,將為目標(biāo)類使用一個(gè)CGLIB代理。
  • interceptorNames:Advisor的字符串?dāng)?shù)組,可以包括攔截器或其它通知的名字。 順序是很重要的,排在前面的將被優(yōu)先服務(wù)。就是說列表里的第一個(gè)攔截器將能夠第一個(gè)攔截調(diào)用。

這里的名字是當(dāng)前工廠中bean的名字,包括父工廠中bean的名字。這里你不能使用bean的引用因?yàn)檫@會(huì)導(dǎo)致ProxyFactoryBean忽略通知的單例設(shè)置。
你可以把一個(gè)攔截器的名字加上一個(gè)星號(hào)作為后綴(*)。這將導(dǎo)致這個(gè)應(yīng)用程序里所有名字以星號(hào)之前部分開頭的通知器都被應(yīng)用。

單例:工廠是否應(yīng)該返回同一個(gè)對(duì)象,不論方法getObject()被調(diào)用的多頻繁。 多個(gè)FactoryBean實(shí)現(xiàn)都提供了這個(gè)方法。缺省值是true。 如果你希望使用有狀態(tài)的通知--例如,有狀態(tài)的mixin--可以把單例屬性的值設(shè)置為false來使用原型通知。

3.基于JDK和CGLIB的代理:

如果一個(gè)需要被代理的目標(biāo)對(duì)象的類(后面將簡(jiǎn)單地稱它為目標(biāo)類)沒有實(shí)現(xiàn)任何接口,那么一個(gè)基于CGLIB的代理將被創(chuàng)建。 這是最簡(jiǎn)單的場(chǎng)景,因?yàn)镴DK代理是基于接口的,沒有接口意味著沒有使用JDK進(jìn)行代理的可能.

如果ProxyFactoryBean的proxyTargetClass屬性被設(shè)為true,那么一個(gè)基于CGLIB的代理將創(chuàng)建。 這樣的規(guī)定是有意義的,遵循了最小驚訝法則(保證了設(shè)定的一致性)。甚至當(dāng)ProxyFactoryBean的proxyInterfaces屬性被設(shè)置為一個(gè)或者多個(gè)全限定接口名, 而proxyTargetClass屬性被設(shè)置為true仍然將實(shí)際使用基于CGLIB的代理。

如果ProxyFactoryBean的proxyInterfaces屬性被設(shè)置為一個(gè)或者多個(gè)全限定接口名,一個(gè)基于JDK的代理將被創(chuàng)建。 被創(chuàng)建的代理將實(shí)現(xiàn)所有在proxyInterfaces屬性里被說明的接口; 如果目標(biāo)類實(shí)現(xiàn)了全部在proxyInterfaces屬性里說明的接口以及一些額外接口,返回的代理將只實(shí)現(xiàn)說明的接口而不會(huì)實(shí)現(xiàn)那些額外接口。

如果ProxyFactoryBean的proxyInterfaces屬性沒有被設(shè)置, 但是目標(biāo)類實(shí)現(xiàn)了一個(gè)(或者更多)接口,那么ProxyFactoryBean將自動(dòng)檢測(cè)到這個(gè)目標(biāo)類已經(jīng)實(shí)現(xiàn)了至少一個(gè)接口, 一個(gè)基于JDK的代理將被創(chuàng)建。被實(shí)際代理的接口將是目標(biāo)類所實(shí)現(xiàn)的全部接口; 實(shí)際上,這和在proxyInterfaces屬性中列出目標(biāo)類實(shí)現(xiàn)的每個(gè)接口的情況是一樣的。 然而,這將顯著地減少工作量以及輸入錯(cuò)誤的可能性。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

原文鏈接:http://blog.csdn.net/jenny8080/article/details/54576187

延伸 · 閱讀

精彩推薦
  • Java教程Java實(shí)現(xiàn)聊天機(jī)器人完善版

    Java實(shí)現(xiàn)聊天機(jī)器人完善版

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)聊天機(jī)器人完善版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    KillerCodes5152021-09-26
  • Java教程詳解如何使用IntelliJ IDEA新建一個(gè)Servlet項(xiàng)目

    詳解如何使用IntelliJ IDEA新建一個(gè)Servlet項(xiàng)目

    這篇文章主要介紹了詳解如何使用IntelliJ IDEA新建一個(gè)Servlet項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧...

    xuanm11422021-06-17
  • Java教程帶你入門Java的數(shù)組

    帶你入門Java的數(shù)組

    這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的定義和使用的相關(guān)資料,,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起...

    貪玩的阿柒8692021-09-28
  • Java教程Springmvc自定義類型轉(zhuǎn)換器實(shí)現(xiàn)步驟

    Springmvc自定義類型轉(zhuǎn)換器實(shí)現(xiàn)步驟

    這篇文章主要介紹了Springmvc自定義類型轉(zhuǎn)換器實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可...

    白熊啊3402020-08-31
  • Java教程解決Intellij IDEA 使用Spring-boot-devTools無效的問題

    解決Intellij IDEA 使用Spring-boot-devTools無效的問題

    下面小編就為大家?guī)硪黄鉀QIntellij IDEA 使用Spring-boot-devTools無效的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來...

    Java之家8622020-11-27
  • Java教程詳解Java分布式事務(wù)的 6 種解決方案

    詳解Java分布式事務(wù)的 6 種解決方案

    在分布式系統(tǒng)、微服務(wù)架構(gòu)大行其道的今天,服務(wù)間互相調(diào)用出現(xiàn)失敗已經(jīng)成為常態(tài),本文側(cè)重于其他幾項(xiàng),關(guān)于 2PC、3PC 傳統(tǒng)事務(wù),網(wǎng)上資料已經(jīng)非常多...

    Java技術(shù)棧7422021-09-16
  • Java教程Spring IOC源碼之bean的注冊(cè)過程講解

    Spring IOC源碼之bean的注冊(cè)過程講解

    這篇文章主要介紹了Spring IOC源碼之bean的注冊(cè)過程講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教...

    hansmall11702021-12-29
  • Java教程Spring Core動(dòng)態(tài)代理的實(shí)現(xiàn)代碼

    Spring Core動(dòng)態(tài)代理的實(shí)現(xiàn)代碼

    通過JDK的Proxy方式或者CGLIB方式生成代理對(duì)象的時(shí)候,相關(guān)的攔截器已經(jīng)配置到代理對(duì)象中去了,接下來通過本文給大家介紹Spring Core動(dòng)態(tài)代理的相關(guān)知識(shí)...

    大頭河10502022-02-22
主站蜘蛛池模板: 午夜福利在线观看6080 | 久久偷拍人 | 久久久久久久久女黄9999 | 美女扒开两腿露出尿口的视频 | 日韩成人精品在线 | 久久99热狠狠色一区二区 | 久久精品在现线观看免费15 | 日本一道高清不卡免费 | 国产免费成人在线视频 | 91探花在线播放 | 狠狠干狠狠插 | 被老头操 | 午夜精品久久久久久久99蜜桃 | 精新精新国产自在现 | 国产欧美日韩综合二区三区 | 美国女网址www呦女 美国复古性经典xxxxx | 欧美日韩国产一区二区三区伦 | 国产成人咱精品视频免费网站 | uoco福利姬网站 | 免费看美女被靠到爽的视频 | 国产66 | 国产va免费精品高清在线 | 白丝校花被扒开双腿喷水小说 | 亚洲国产精品日本无码网站 | 秋霞理论最新三级理论最 | 四虎国产精品视频免费看 | 脱了白丝校花的内裤猛烈进入 | chinesespanking调教| 九九九九在线视频播放 | 国产精品久久久99 | 亚洲国产AV一区二区三区四区 | 精品国产麻豆免费人成网站 | 国产三级精品久久三级国专区 | 四虎影院观看 | 乌克兰一级片 | a男人天堂 | 亚洲国产成人精品无码区APP | 四虎永久在线精品国产馆v视影院 | 非洲黑人bbwbbwbbw | 热久久99精品这里有精品 | 日本三级香港三级久久99 |