Spring AOP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/%e5%87%bd%e6%95%b0%e8%bf%94%e5%9b%9e%e5%80%bc' title='鍑芥暟杩斿洖鍊?>鍑芥暟杩斿洖鍊?/a>   method   strong   nbsp   code   鍙栧嚭   鍒囬潰   img   ros   

1. 浠€涔堟槸闈㈠悜鍒囬潰缂栫▼锛?/h3>

??闈㈠悜鍒囬潰缂栫▼鏄疭pring鐨勭浜屽ぇ鐗规€э紝瀹冭兘灏嗕竴涓嚱鏁颁腑闈炰富浣撲絾鏈夊緢蹇呰鐨勪唬鐮佸皝瑁呭埌涓€涓崟鐙殑绫讳腑锛屽湪绋嬪簭杩愯鐨勬椂鍊欏啀鎶婂畠浠彃鍏ュ埌鍑芥暟涓€傝繖鏍疯兘浣跨▼搴忕尶鍙叧娉ㄥ嚱鏁扮殑涓讳綋鍔熻兘锛岃€屼笖鍐欏嚭鏉ョ殑浠g爜鍏锋湁鍏锋湁杈冨己鐨勫彲璇绘€э紝绠€绾︽槑浜嗐€?nbsp;

闈㈠悜鍒囬潰缂栫▼鐨勪紭鐐规湁涓や釜锛?nbsp;
1. 涓€涓嚱鏁颁腑鎵€鏈夐澶栫殑鍔熻兘閮借灏佽鍦ㄤ竴涓被涓紝鑰屼笉鏄垎鏁e湪鍑芥暟鐨勫悇澶勩€?nbsp;
2. 鐢变簬灏嗛潪涓讳綋鍔熻兘鐨勪唬鐮佽浆绉诲埌鍏朵粬绫讳腑锛屽洜姝ゅ嚱鏁扮殑浠g爜灏嗘洿浣崇畝娲併€?/span>

寮€濮嬩娇鐢?/h2>

??鍋囪鐜板湪鏈変竴涓嚱鏁帮紝鐢ㄦ潵鏌ヨ鏁版嵁搴撲腑鍚嶅瓧涓簄ame鐨凱erson瀵硅薄锛?/p>

 public String queryPersons(String name){
        //鏌ヨ鐨勫叿浣撴搷浣溾€︹€?        //姝ゅ鐪佺暐100琛屼唬鐮佲€︹€?/span>
    }

銆€銆€鎴戜滑闇€瑕佸湪鏌ヨ寮€濮嬪墠鍒ゆ柇name鏄惁涓虹┖锛屽湪鏌ヨ缁撴潫鍚庤褰曟搷浣滄棩蹇楋紝鍦ㄦ煡璇㈠彂鐢熷紓甯告椂璁板綍寮傚父鏃ュ織銆?nbsp;
銆€銆€鍦ㄨ繃鍘伙紝鎴戜滑鎶婅繖浜涗唬鐮侀兘鐩存帴鍐欏湪杩欎釜鍑芥暟涓紝杩欐牱浼氬鑷磋繖涓嚱鏁板緢闀匡紝鍙鎬у緢宸€備笅闈㈡垜浠娇鐢ㄩ潰鍚戝垏闈㈢紪绋嬬殑鎬濇兂瑙e喅杩欎釜闂銆?nbsp;

1. 瀹氫箟鍒囬潰浠g爜

棣栧厛闇€瑕佸皢杩欎釜鍑芥暟涓澶栫殑鍔熻兘灏佽鍒颁竴涓被涓紝杩欎釜绫诲氨鏄竴涓櫘閫氱被锛屽姛鑳藉皝瑁呭湪鍑芥暟涓細

class PersonAspect(){
    /**
      * 鍒ゆ柇鍙傛暟鏄惁涓虹┖
      */
    public void verifyNull(String name){
        //鍒ゆ柇鍙傛暟鏄惁涓虹┖
    }

    /**
      * 璁板綍鎿嶄綔鏃ュ織
      */
    public void logInfo(){

    }

    /**
      * 璁板綍寮傚父鏃ュ織
      */
    public void logError(){

    }
}

2. 灏嗗垏闈㈠0鏄庝负bean

鍦⊿pring鐨勯厤缃枃浠朵腑娣诲姞bean鐨勫0鏄庯細

 <bean id="personAspect" class="com.njupt.PersonAspect">
    </bean>

鎴栬€呯洿鎺ュ湪PersonAspect绫讳笂浣跨敤@Componet鏍囨敞锛?/p>

鎶€鏈垎浜浘鐗? id=
@Componet("personAspect")
class PersonAspect(){
    /**
      * 鍒ゆ柇鍙傛暟鏄惁涓虹┖
      */
    public void verifyNull(String name){
        //鍒ゆ柇鍙傛暟鏄惁涓虹┖
    }

    /**
      * 璁板綍鎿嶄綔鏃ュ織
      */
    public void logInfo(){

    }

    /**
      * 璁板綍寮傚父鏃ュ織
      */
    public void logError(){

    }
}
View Code

3. 澹版槑閫氱煡

瀹氫箟濂戒簡棰濆鐨勫姛鑳戒箣鍚庯紝鎺ヤ笅鏉ユ垜浠渶瑕佸憡璇塖pring锛岃繖浜涘姛鑳介渶瑕佸湪浣曟椂娣诲姞鍒?span style="background-color: #ff9900">鍝釜鍑芥暟鐨勪粈涔堜綅缃?/strong>锛屽洜姝ゆ垜浠渶瑕佸湪Spring鐨勯厤缃枃浠朵腑浣滃涓嬪0鏄庯細

<aop:config>
        <aop:aspect ref="personAspect">
            <!-- 鍦╭ueryPersons鍑芥暟鎵ц涔嬪墠鍏堣繍琛屽嚱鏁皏erifyNull -->
            <aop:before pointcut="excution(* com.njupt.Person.queryPersons(..))" method="verifyNull" />

            <!-- 鍦╭ueryPersons鍑芥暟鎵ц涔嬪悗鍐嶈繍琛屽嚱鏁發ogInfo -->
            <aop:after-returning pointcut="excution(* com.njupt.Person.queryPersons(..))" method="logInfo" />

            <!-- 鍦╭ueryPersons鍑芥暟鍙戠敓寮傚父鏃惰繍琛屽嚱鏁發ogError -->
            <aop:throwing pointcut="excution(* com.njupt.Person.queryPersons(..))" method="logError" />
    </aop:config>

鍒版涓烘锛孲pring AOP宸茬粡鍙互杩愯浜嗭紒

4. 澹版槑鐜粫閫氱煡

??鍦ㄤ笂杩扮ず渚嬩腑锛屽嚱鏁板墠鎻掑叆涓€娈典唬鐮侊紝鍑芥暟鍚庢彃鍏ヤ竴娈典唬鐮侊紝鍑芥暟寮傚父鏃舵彃鍏ヤ竴娈典唬鐮侊紝杩欎簺浠g爜鍧楅兘鏄嫭绔嬬殑锛屾棤娉曞叡浜暟鎹€傚鏋滈渶瑕佸疄鐜板嚱鏁板墠鍚庝唬鐮佸潡鐨勬暟鎹叡浜紝閭e氨瑕佷娇鐢ㄧ幆缁曢€氱煡銆?nbsp;
璇存潵涔熷緢绠€鍗曪紝棣栧厛闇€瑕佸湪PersonAspect绫讳腑鍔犱笂涓€涓弬鏁颁负ProceedingJoinPoint鐨勫嚱鏁帮紝濡備笅鎵€绀猴細

@Componet("personAspect")
class PersonAspect(){
    /**
      * 鍒ゆ柇鍙傛暟鏄惁涓虹┖
      */
    public void verifyNull(String name){
        //鍒ゆ柇鍙傛暟鏄惁涓虹┖
    }

    /**
      * 璁板綍鎿嶄綔鏃ュ織
      */
    public void logInfo(){

    }

    /**
      * 璁板綍寮傚父鏃ュ織
      */
    public void logError(){

    }

    /**
      * 鐜粫閫氱煡
      */
    public void xxx(ProceedingJoinPoint joinPoint){
        int num = 0;
        //鍦ㄥ嚱鏁板墠鎵ц涓€浜涘姛鑳斤紝淇敼num鍙傛暟

        //鎵ц鍑芥暟
        joinPoint.proceed();

        //鍦ㄥ嚱鏁板悗澶勭悊num
        num++;
        //鈥︹€?/span>
    }
}

鐒跺悗鍦ㄩ厤缃枃浠朵腑鎶婅繖涓嚱鏁板0鏄庝负鐜粫閫氱煡鍗冲彲锛?/p>

 <aop:config>
        <aop:aspect ref="personAspect">
            <!-- 鍦╭ueryPersons鍑芥暟鎵ц涔嬪墠鍏堣繍琛屽嚱鏁皏erifyNull -->
            <aop:before pointcut="excution(* com.njupt.Person.queryPersons(..))" method="verifyNull" />

            <!-- 鍦╭ueryPersons鍑芥暟鎵ц涔嬪悗鍐嶈繍琛屽嚱鏁發ogInfo -->
            <aop:after-returning pointcut="excution(* com.njupt.Person.queryPersons(..))" method="logInfo" />

            <!-- 鍦╭ueryPersons鍑芥暟鍙戠敓寮傚父鏃惰繍琛屽嚱鏁發ogError -->
            <aop:throwing pointcut="excution(* com.njupt.Person.queryPersons(..))" method="logError" />

            <!-- 鐜粫閫氱煡 -->
            <aop:around pointcut="excution(* com.njupt.Person.queryPersons(..))" method="xxx()" />
        </aop:aspect>
    </aop:config>

鍒版涓烘锛孲pring鐨凙OP浠嬬粛瀹屾瘯锛屼笅闈粙缁嶅浣曚娇鐢ㄦ敞瑙e彇浠ML銆?/p>

浣跨敤娉ㄨВ浠f浛XML

1. 娉ㄨВ鍒囬潰

?  棣栧厛闇€瑕佸湪鍒囬潰绫讳笂鍔犱笂娉ㄨВ@Aspect锛屽憡璇塖pring杩欎釜绫绘槸涓垏闈㈢被锛?nbsp;
??鍏舵闇€瑕佸湪鍒囬潰绫讳腑鍒涘缓涓€涓嚱鏁帮紝鐢ㄤ簬瀹氫箟鍒囩偣銆傝鍑芥暟鐨勫悕瀛楀嵆涓哄垏鐐瑰悕锛屽嚱鏁拌繑鍥炲€煎拰鍙傛暟鍧囦负绌恒€?/p>

@Aspect
class PersonAspect(){
    /**
      * 瀹氫箟鍒囩偣
      */
    @Pointcut("excution(* com.njupt.Person.queryPersons(..))")
    public void personAspect(){
    }

    /**
      * 鍒ゆ柇鍙傛暟鏄惁涓虹┖
      */
    @Before("personAspect()")
    public void verifyNull(String name){
        //鍒ゆ柇鍙傛暟鏄惁涓虹┖
    }

    /**
      * 璁板綍鎿嶄綔鏃ュ織
      */
    @AfterReturning("personAspect()")
    public void logInfo(){

    }

    /**
      * 璁板綍寮傚父鏃ュ織
      */
    @AfterThrowing("personAspect()")
    public void logError(){

    }

    /**
      * 鐜粫閫氱煡
      */
    @Around("personAspect()")
    public void xxx(ProceedingJoinPoint joinPoint){
        int num = 0;
        //鍦ㄥ嚱鏁板墠鎵ц涓€浜涘姛鑳斤紝淇敼num鍙傛暟

        //鎵ц鍑芥暟
        joinPoint.proceed();

        //鍦ㄥ嚱鏁板悗澶勭悊num
        num++;
        //鈥︹€?/span>
    }
}

杞嚜锛歨ttps://blog.csdn.net/u010425776/article/details/51044138

 

以上是关于Spring AOP的主要内容,如果未能解决你的问题,请参考以下文章

JAVA之AOP

Spring AOP

Spring源码高级笔记之——Spring AOP应用

2018.12.24 Spring中的aop演示

Spring框架 AOP

Spring的AOP面向切面编程