spring aop

AOP 術(shù)語(yǔ)

public class user{
    public void add(){...}
    public void update(){...}
    public void delete(){...}
    public void findAll(){...}
}
  • Join point(連接點(diǎn)):類里面可以被增強(qiáng)的方法穆碎,這些方法稱為連接點(diǎn)
  • Point cut(切入點(diǎn)):在類里面可以有很多方法被增強(qiáng)柒室,比如實(shí)際操作中蔼紧,只是增強(qiáng)了類里面的add方法和update方法税朴,實(shí)際增強(qiáng)的方法稱為切入點(diǎn)
  • Advice(通知/增強(qiáng)):增強(qiáng)的邏輯,比如擴(kuò)展日志功能轮傍,這個(gè)日志功能稱為增強(qiáng)

Advice類型:
前置通知:方法之前執(zhí)行
后置通知:在方法執(zhí)行之后執(zhí)行
最終通知:在后置之后來執(zhí)行
異常通知:方法出現(xiàn)異常時(shí)執(zhí)行
環(huán)繞通知:方法之前和方法之后執(zhí)行

  • Aspect(切面):把增強(qiáng)應(yīng)用到具體的方法上面,這個(gè)過程稱為切面首装,也就是把增強(qiáng)應(yīng)用到切入點(diǎn)的過程
  • Introduction(引介):引介是一種特殊的通知创夜,在不修改類代碼的前提下,可以在運(yùn)行期為類動(dòng)態(tài)地添加一些方法或?qū)傩?/li>
  • Target(目標(biāo)對(duì)象):代理的目標(biāo)對(duì)象仙逻,也就是要增強(qiáng)的類(增強(qiáng)方法所在的那個(gè)類)
  • weaving(織入):把a(bǔ)dvice(通知/增強(qiáng))應(yīng)用到target(目標(biāo)對(duì)象)的過程
  • Proxy(代理):一個(gè)類被AOP織入增強(qiáng)后驰吓,就產(chǎn)生一個(gè)結(jié)果代理類

AspectJ

AspectJ簡(jiǎn)介

  • AspectJ是一個(gè)面向切面的框架揍魂,它擴(kuò)展了Java語(yǔ)言。AspectJ定義了AOP語(yǔ)法棚瘟,所以它有一個(gè)專門的編譯器用來生成遵守Java字節(jié)編碼規(guī)范的class文件现斋。
  • AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架
  • Spring2.0以后新增了對(duì)AspectJ切入點(diǎn)表達(dá)式支持
  • @AspectJ是AspectJ1.5新增功能,通過JDK5注解技術(shù)偎蘸,允許直接在Bean類中定義切面
  • 新版本Spring框架庄蹋,建議使用AspectJ方式開發(fā)AOP
  • 使用AspectJ需要導(dǎo)入Spring AOP和AspectJ相關(guān)的jar包

AspectJ不是spring一部分,只是和spring一起使用進(jìn)行aop操作


Spring的AOP操作

使用AspectJ實(shí)現(xiàn)aop的兩種方式

  1. 基于AspectJ的xml配置
  2. 基于AspectJ的注解方式

AOP準(zhǔn)備工作

xml方式

  1. 導(dǎo)入相關(guān)jar包
  2. spring核心配置文件迷雪,添加aop約束
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframe.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
   
</beans>
  1. 示例代碼
package com.zhangjinbang.aop;

public class Book{

   public void add(){
       System.out.println("add book");
   }
}

package com.zhangjinbang.aop;

public class MyBook{

    public void before1{
        System.out.println("前置增強(qiáng)...");
    }
}

使用表達(dá)式配置切入點(diǎn)

常用的表達(dá)式

execution(<訪問修飾符>?<返回類型><方法名>(<參數(shù)>)<異常>)

"*" 表示的是任意的意思

常用寫法

execution(* com.zhangjinbang.aop.Book.add(..))

execution(* com.zhangjinbang.aop.Book.*(..))

execution(* *.*(..))

匹配所有save開頭的方法 execution(* save*(..)) 

配置文件 bean.xml

<beans xmls="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframe.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
       <!--配置對(duì)象-->
       <bean id="book" class="com.zhangjinbang.aop.Book"></bean>
       <bean id="myBook" class="com.zhangjinbang.aop.MyBook"></bean>
       
       <!--配置AOP操作-->
       <aop:config>
           <!--配置切入點(diǎn)-->
           <aop:pointcut expression="execution(* com.zhangjinbang.aop.Book.*(..))" id="pointcut1">
           <!--配置切面  把增強(qiáng)用到方法上-->
           <aop:aspect ref="myBook">
               <!--配置增強(qiáng)類型-->
               <aop:before method="before1" pointcut-ref="pointcut1">
           </aop:aspect>
       </aop:config>

</beans>

測(cè)試

package com.zhangjinbang.aop;
import org.junit.Test;
...

public class BookTest{
    @Test
    public void testAdd(){
        ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
        Book book=(Book)context.getBean("book");
        book.add();
    }
}

控制臺(tái)輸出內(nèi)容

前置增強(qiáng)...
add book

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末限书,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子章咧,更是在濱河造成了極大的恐慌倦西,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赁严,死亡現(xiàn)場(chǎng)離奇詭異扰柠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疼约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門卤档,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人程剥,你說我怎么就攤上這事劝枣。” “怎么了织鲸?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵舔腾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我搂擦,道長(zhǎng)稳诚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任盾饮,我火速辦了婚禮采桃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丘损。我一直安慰自己普办,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布徘钥。 她就那樣靜靜地躺著衔蹲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舆驶,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天橱健,我揣著相機(jī)與錄音,去河邊找鬼沙廉。 笑死拘荡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撬陵。 我是一名探鬼主播珊皿,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼巨税!你這毒婦竟也來了蟋定?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤草添,失蹤者是張志新(化名)和其女友劉穎驶兜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體远寸,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抄淑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了而晒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝇狼。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倡怎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贱枣,我是刑警寧澤监署,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站纽哥,受9級(jí)特大地震影響钠乏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜春塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一晓避、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧只壳,春花似錦俏拱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惕艳,卻和暖如春搞隐,著一層夾襖步出監(jiān)牢的瞬間驹愚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工劣纲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逢捺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓癞季,卻偏偏與公主長(zhǎng)得像洛搀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漫雕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容