内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Springboot中切面編程AOP是怎樣的

這篇文章將為大家詳細講解有關(guān)Springboot中切面編程AOP是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出涼州免費做網(wǎng)站回饋大家。

Springboot 切面編程AOP

AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法。它和我們平時接觸到的OOP都是編程的不同思想,OOP,即『面向?qū)ο缶幊獭?,它提倡的是將功能模塊化,對象化,而AOP的思想,則不太一樣,它提倡的是針對同一類問題的統(tǒng)一處理,當(dāng)然,我們在實際編程過程中,不可能單純的按照AOP或者OOP的思想來編程,很多時候,可能會混合多種編程思想,大家也不必要糾結(jié)該使用哪種思想,取百家之長,才是正道。

AspectJ實際上是對AOP編程思想的一個實踐,當(dāng)然,除了AspectJ以外,還有很多其它的AOP實現(xiàn),例如ASMDex,但目前最好、最方便的,依然是AspectJ。

SpringAOP包含AspectJ,這是因為Spring AOP借助了AspectJ的語法,但底層技術(shù)用的還是Spring自己的。

Spring Aop采用的動態(tài)織入,而Aspectj是靜態(tài)織入。

靜態(tài)織入:指在編譯時期就織入,即:編譯出來的class文件,字節(jié)碼就已經(jīng)被織入了。

動態(tài)織入又分靜動兩種,靜則指織入過程只在第一次調(diào)用時執(zhí)行;動則指根據(jù)代碼動態(tài)運行的中間狀態(tài)來決定如何操作,每次調(diào)用Target的時候都執(zhí)行。有不清楚的同學(xué),可以自己補下基礎(chǔ)的代理知識。

一、AOP相關(guān)術(shù)語

pointcut切入點

通常一個pointcut,會選取程序中的某些我們感興趣的執(zhí)行點,或者說是程序執(zhí)行點的集合。

是一個(組)基于正則表達式的表達式。

joinPoint連接點

通過pointcut選取出來的集合中的具體的一個執(zhí)行點,我們就叫JoinPoint.

target目標(biāo)類

被aspectj橫切的對象。我們所說的joinPoint就是Target的某一行,如方法開始執(zhí)行的地方、方法類調(diào)用某個其他方法的代碼。

advice通知

在選取出來的JoinPoint上要執(zhí)行的操作、邏輯。

典型的 Advice 類型有 before、after 和 around,分別表示在目標(biāo)方法執(zhí)行之前、執(zhí)行后和完全替代目標(biāo)方法執(zhí)行的代碼。

@Before前置通知   			目標(biāo)方法執(zhí)行前
@After后置通知    			目標(biāo)方法執(zhí)行后,無論是否發(fā)生異常
@AfterReturning后置通知    	目標(biāo)方法正常執(zhí)行結(jié)束后,可以知道目標(biāo)方法的返回值
@AfterThrowing后置通知		目標(biāo)方法執(zhí)行發(fā)生異常后,可以訪問異常對象,進行打印。也可以指定異常發(fā)生時才執(zhí)行
@Around環(huán)繞通知				包含上面4種

二、實例

2.1、引入jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

在完成了引入AOP依賴包后,不需要去做其他配置。AOP的默認(rèn)配置屬性中,spring.aop.auto屬性默認(rèn)是開啟的,也就是說只要引入了AOP依賴后,默認(rèn)已經(jīng)增加了@EnableAspectJAutoProxy,不需要在程序主類中增加@EnableAspectJAutoProxy來啟用。

2.2、業(yè)務(wù)模塊

@RestController
@RequestMapping("/aopController")
public class AopController {

    @GetMapping(value = "/Curry")
    public void Curry(){
        System.out.println("庫里上場打球了?。?quot;);
    }

    @GetMapping(value = "/Harden")
    public void Harden(){
        System.out.println("哈登上場打球了??!");
    }

    @GetMapping(value = "/Antetokounmpo")
    public void Antetokounmpo(){
        System.out.println("字母哥上場打球了?。?quot;);
    }


    @GetMapping(value = "/Jokic")
    public void Jokic(){
        System.out.println("約基奇上場打球了?。?quot;);
    }

    @GetMapping(value = "/Durant/{point}")
    public void Durant(@PathVariable("point")  int point){
        System.out.println("杜蘭特上場打球了?。?quot;);
    }


}

2.3、定義切面類

@Aspect 注解 使之成為切面類

@Component 注解 把切面類加入到IOC容器中

@Aspect
@Component
public class CustomAspect {


    //定義切入點
    @Pointcut("execution(public * com.lee.springaop.controller.AopController.*(..)))")
    public void CustomAspect(){

    }


    @Pointcut("execution(public * com.lee.springaop.controller.AopController.Durant(..))")
    public void CustomAroundAspect(){

    }

    @Pointcut("execution(public * com.lee.springaop.controller.AopController.Durant(int)) && args(int))")
    public void CustomAroundAspect2(){

    }

    //前置通知
    @Before("CustomAspect()")
    public void doBeforeGame(){
        System.out.println("before : 經(jīng)紀(jì)人正在處理球星賽前事務(wù)!");
    }

    //后置通知
    @After("CustomAspect()")
    public void doAfterGame(){
        System.out.println("after : 經(jīng)紀(jì)人為球星表現(xiàn)瘋狂鼓掌!");
    }

    //后置通知--正常返回
    @AfterReturning("CustomAspect()")
    public void doAfterReturningGame(){
        System.out.println("after returning : 返回通知:經(jīng)紀(jì)人為球星表現(xiàn)瘋狂鼓掌!");
    }

    //后置通知--發(fā)生異常
    @AfterThrowing("CustomAspect()")
    public void doAfterThrowingGame(){
        System.out.println("after throwing : 異常通知:球迷要求退票!");
    }


    //環(huán)繞通知
    @Around("CustomAroundAspect()")
    public void doAroundGame(ProceedingJoinPoint joinPoint) {
        try {

            System.out.println("Around before 1: 經(jīng)紀(jì)人正在處理球星賽前事務(wù)");

            //參數(shù)
            Object[] args = joinPoint.getArgs();
            for (Object o : args){
                System.out.println("params 1: "+o.toString());
            }

            //target
            Object target = joinPoint.getTarget();
            System.out.println("target 1: "+target.toString());

            //進行下一個advice或目標(biāo)方法調(diào)用
            joinPoint.proceed();

            System.out.println("Around after 1 : 返回通知:經(jīng)紀(jì)人為球星表現(xiàn)瘋狂鼓掌");
        } catch (Throwable throwable) {
            System.out.println("Aroung throwing 1: 異常通知:球迷要求退票");
        }
    }


    //環(huán)繞通知2
    @Around("CustomAroundAspect2() && args(point)")
    public void doAroundGame2(ProceedingJoinPoint joinPoint,int point) {
        try {

            System.out.println("Around before 2: 經(jīng)紀(jì)人正在處理球星賽前事務(wù)");


            //進行下一個advice或目標(biāo)方法調(diào)用
            joinPoint.proceed();

            System.out.println("球星本場得到 2 :" + point + "分" );

            System.out.println("Around after 2 : 返回通知:經(jīng)紀(jì)人為球星表現(xiàn)瘋狂鼓掌");
        } catch (Throwable throwable) {
            System.out.println("Aroung throwing 2 : 異常通知:球迷要求退票");
        }
    }


}

2.4、測試

瀏覽器訪問:http://127.0.0.1:8080/aopController/Harden

Springboot中切面編程AOP是怎樣的

瀏覽器訪問:http://127.0.0.1:8080/aopController/Durant/80

Springboot中切面編程AOP是怎樣的

三、相關(guān)語法

3.1、通配符

*		匹配任何數(shù)量的字符

..		匹配任何數(shù)量字符的重復(fù)
			如:類型模式中:匹配任何數(shù)量的子包;  方法參數(shù)模式中:匹配任何數(shù)量參數(shù)

+		匹配指定類型的子類型
			注:僅能作為后綴放在類型模式后邊

eg:

java.lang.String    匹配String類型。

java.*.String       匹配java包下的任何“一級子包”下的String類型。匹配java.lang.String,但不匹配java.lang.ss.String

java..*             匹配java包及任何子包下的任何類型。如匹配java.lang.String、java.lang.annotation.Annotation 

java.lang.*ing      匹配任何java.lang包下的以ing結(jié)尾的類型。  

java.lang.Number+   匹配java.lang包下的任何Number的自類型。如匹配java.lang.Integer,也匹配java.math.BigInteger 


“()”表示方法沒有任何參數(shù)
“(..)”表示匹配接受任意個參數(shù)的方法
“(..,java.lang.String)”表示匹配接受java.lang.String類型的參數(shù)結(jié)束,且其前邊可以接受有任意個參數(shù)的方法;
“(java.lang.String,..)” 表示匹配接受java.lang.String類型的參數(shù)開始,且其后邊可以接受任意個參數(shù)的方法;
“(*,java.lang.String)” 表示匹配接受java.lang.String類型的參數(shù)結(jié)束,且其前邊接受有一個任意類型參數(shù)的方法;

3.2、表達式

&&  且

||	或

!	非

3.3、切入點指示符

3.3.1、指示符
execution	匹配方法執(zhí)行的鏈接點

within		用于匹配指定類型內(nèi)的方法執(zhí)行

this		用于匹配當(dāng)前AOP代理對象類型的執(zhí)行方法

target		用于匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法

args		用于匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)為指定類型的執(zhí)行方法


@within			用于匹配所以持有指定注解類型內(nèi)的方法

@target			用于匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法,其中目標(biāo)對象持有指定的注解

@args			用于匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)持有指定注解的執(zhí)行

@annotation		用于匹配當(dāng)前執(zhí)行方法持有指定注解的方法



bean					用于匹配特定名稱的Bean對象的執(zhí)行方法

reference pointcut		表示引用其他命名切入點
3.3.2、實例:
3.3.2.1、execution
模式描述
public * *(..)任何公共方法的執(zhí)行
* cn.javass..IPointcutService.*()cn.javass包及所有子包下IPointcutService接口中的任何無參方法
* cn.javass..*. *(..)cn.javass包及所有子包下任何類的任何方法
* cn.javass..IPointcutService.*( *)cn.javass包及所有子包下IPointcutService接口的任何只有一個參數(shù)方法
* (!cn.javass..IPointcutService+).*(..)非“cn.javass包及所有子包下IPointcutService接口及子類型”的任何方法
* cn.javass..IPointcutService+.*()cn.javass包及所有子包下IPointcutService接口及子類型的的任何無參方法
* cn.javass..IPointcut*.test*(java.util.Date)cn.javass包及所有子包下IPointcut前綴類型的的以test開頭的只有一個參數(shù)類型為java.util.Date的方法
* cn.javass..IPointcut*.test*(..) throws IllegalArgumentException, ArrayIndexOutOfBoundsExceptioncn.javass包及所有子包下IPointcut前綴類型的的任何方法,且拋出IllegalArgumentException和ArrayIndexOutOfBoundsException異常
* (cn.javass..IPointcutService+&& java.io.Serializable+).*(..)任何實現(xiàn)了cn.javass包及所有子包下IPointcutService接口和java.io.Serializable接口的類型的任何方法
@java.lang.Deprecated * *(..)任何持有@java.lang.Deprecated注解的方法
@java.lang.Deprecated @cn.javass..Secure * *(..)任何持有@java.lang.Deprecated和@cn.javass..Secure注解的方法
@(java.lang.Deprecated || cn.javass..Secure) * *(..)任何持有@java.lang.Deprecated或@ cn.javass..Secure注解的方法
(@cn.javass..Secure *) *(..)任何返回值類型持有@cn.javass..Secure的方法
* (@cn.javass..Secure ).(..)任何定義方法的類型持有@cn.javass..Secure的方法
* (@cn.javass..Secure () , @cn.javass..Secure (*))任何簽名帶有兩個參數(shù)的方法,且這個兩個參數(shù)都被@ Secure標(biāo)記了,如public void test(@Secure String str1, @Secure String str1);
* *((@ cn.javass..Secure ))或 *(@ cn.javass..Secure *)任何帶有一個參數(shù)的方法,且該參數(shù)類型持有@ cn.javass..Secure;如public void test(Model model);且Model類上持有@Secure注解
* *(@cn.javass..Secure (@cn.javass..Secure *) ,@ cn.javass..Secure (@cn.javass..Secure *))任何帶有兩個參數(shù)的方法,且這兩個參數(shù)都被@ cn.javass..Secure標(biāo)記了;且這兩個參數(shù)的類型上都持有@ cn.javass..Secure;
* *(java.util.Map<cn.javass..Model, cn.javass..Model>, ..)任何帶有一個java.util.Map參數(shù)的方法,且該參數(shù)類型是以< cn.javass..Model, cn.javass..Model >為泛型參數(shù);注意只匹配第一個參數(shù)為java.util.Map,不包括子類型;如public void test(HashMap<Model, Model> map, String str);將不匹配,必須使用“* *(java.util.HashMap<cn.javass..Model,cn.javass..Model>, ..)”進行匹配;而public void test(Map map, int i);也將不匹配,因為泛型參數(shù)不匹配
* *(java.util.Collection<@cn.javass..Secure *>)任何帶有一個參數(shù)(類型為java.util.Collection)的方法,且該參數(shù)類型是有一個泛型參數(shù),該泛型參數(shù)類型上持有@cn.javass..Secure注解;如public void test(Collection<Model> collection);Model類型上持有@cn.javass..Secure
3.3.2.2、within

within(類型表達式) 匹配指定類內(nèi)的方法執(zhí)行

模式描述
within(cn.javass..*)cn.javass包及子包下的任何方法執(zhí)行
within(cn.javass..IPointcutService+)cn.javass包或所有子包下IPointcutService類型及子類型的任何方法
within(@cn.javass..Secure *)持有cn.javass..Secure注解的任何類型的任何方法必須是在目標(biāo)對象上聲明這個注解,在接口上聲明的對它不起作用
3.3.2.3、this

this(類型全限定名)匹配當(dāng)前AOP代理對象類型的執(zhí)行方法

模式描述
this(cn.javass.spring.chapter6.service.IPointcutService)當(dāng)前AOP對象實現(xiàn)了 IPointcutService接口的任何方法
this(cn.javass.spring.chapter6.service.IIntroductionService)當(dāng)前AOP對象實現(xiàn)了 IIntroductionService接口的任何方法也可能是引入接口
3.3.2.4、target

target(類型全限定名)匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法

模式描述
target(cn.javass.spring.chapter6.service.IPointcutService)當(dāng)前目標(biāo)對象(非AOP對象)實現(xiàn)了 IPointcutService接口的任何方法
target(cn.javass.spring.chapter6.service.IIntroductionService)當(dāng)前目標(biāo)對象(非AOP對象) 實現(xiàn)了IIntroductionService 接口的任何方法不可能是引入接口
3.3.2.5、args

args(類型參數(shù)列表) 匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)為指定類型的執(zhí)行方法

模式描述
args (java.io.Serializable,..)任何一個以接受“傳入?yún)?shù)類型為 java.io.Serializable” 開頭,且其后可跟任意個任意類型的參數(shù)的方法執(zhí)行,args指定的參數(shù)類型是在運行時動態(tài)匹配的
3.3.2.6、@within

使用“@within(注解類型)”匹配所以持有指定注解類型內(nèi)的方法;注解類型也必須是全限定類型名;

模式描述
@within cn.javass.spring.chapter6.Secure)任何目標(biāo)對象對應(yīng)的類型持有Secure注解的類方法;必須是在目標(biāo)對象上聲明這個注解,在接口上聲明的對它不起作用
3.3.2.7、@target

使用“@target(注解類型)”匹配當(dāng)前目標(biāo)對象類型的執(zhí)行方法,其中目標(biāo)對象持有指定的注解;注解類型也必須是全限定類型名

模式描述
@target (cn.javass.spring.chapter6.Secure)任何目標(biāo)對象持有Secure注解的類方法;必須是在目標(biāo)對象上聲明這個注解,在接口上聲明的對它不起作用
3.3.2.8、@args

使用“@args(注解列表)”匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)持有指定注解的執(zhí)行;注解類型也必須是全限定類型名;

模式描述
@args (cn.javass.spring.chapter6.Secure)任何一個只接受一個參數(shù)的方法,且方法運行時傳入的參數(shù)持有注解 cn.javass.spring.chapter6.Secure;動態(tài)切入點,類似于arg指示符;
3.3.2.9、@annotation

使用“@annotation(注解類型)”匹配當(dāng)前執(zhí)行方法持有指定注解的方法;注解類型也必須是全限定類型名;

模式描述
@annotation(cn.javass.spring.chapter6.Secure )當(dāng)前執(zhí)行方法上持有注解 cn.javass.spring.chapter6.Secure將被匹配
3.3.2.10、bean

使用“bean(Bean id或名字通配符)”匹配特定名稱的Bean對象的執(zhí)行方法;Spring ASP擴展的,在AspectJ中無相應(yīng)概念

模式描述
bean(*Service)匹配所有以Service命名(id或name)結(jié)尾的Bean
3.3.2.11、reference pointcut

表示引用其他命名切入點,只有@ApectJ風(fēng)格支持,Schema風(fēng)格不支持

package cn.javass.spring.chapter6.aop;  
import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Pointcut;  
@Aspect  
public class ReferencePointcutAspect {  
    @Pointcut(value="execution(* *())")  
    public void pointcut() {}  
}

引用:

@Before(value = "cn.javass.spring.chapter6.aop.ReferencePointcutAspect.pointcut()")  
public void referencePointcutTest2(JoinPoint jp) {
    
}

關(guān)于Springboot中切面編程AOP是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網(wǎng)站題目:Springboot中切面編程AOP是怎樣的
瀏覽地址:http://m.rwnh.cn/article48/gspihp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)搜索引擎優(yōu)化、網(wǎng)站排名響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計公司企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
洪湖市| 杭锦旗| 涟源市| 石泉县| 金阳县| 利川市| 三门峡市| 张家川| 大名县| 绍兴县| 寿光市| 泽库县| 郁南县| 新乐市| 阳信县| 弥勒县| 勃利县| 铜鼓县| 游戏| 丰顺县| 印江| 鸡东县| 随州市| 红安县| 东乡族自治县| 精河县| 太原市| 高要市| 望江县| 双江| 合山市| 巫山县| 鱼台县| 曲周县| 邵阳县| 包头市| 安福县| 阿勒泰市| 高要市| 南汇区| 南平市|