91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot項目怎么使用aop

發布時間:2023-04-03 17:56:12 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

這篇“SpringBoot項目怎么使用aop”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“SpringBoot項目怎么使用aop”文章吧。

前言

IOC和AOP是Spring中的兩個核心的概念,簡單介紹一下我的理解:

IOC:控制反轉,就是將以前由我們自己手動創建對象的過程交給了Spring,Spring幫助我們生產對象、管理對象、管理對象和對象之間的依賴關系。降低了代碼的耦合度,方便我們后期對項目做維護。舉個通俗一點的例子:
正常情況下,我們在家,餓了,自己做飯。
使用IOC情況下,我們在家,餓了,打電話給商家,飯送過來。
IOC就相當于商家,做飯就相當于創建對象。
也就是說正常情況下,當一個類需要調用其他類的方法時,我們手動通過new、工廠或者其他方式創建對象。
使用IOC情況下,我們只需要注入對象即可。

AOP:面向切面(方便)編程,可以對某一類對象進行監督和控制,在調用這類對象方法的前后去調用指定的代碼,從而對一個方法進行擴展,從而達到增強模塊功能的效果。舉個通俗一點的例子:
正常情況下,直接吃飯。
使用AOP情況下,有個保姆關注著,吃飯前幫忙洗手,吃飯后幫忙收拾碗筷。
AOP就相當于保姆,吃飯就相當于帶調用具體的方法。
也就是說,當我們想對方法進行補充時,并不去直接修改方法,而是通過AOP去補充。當我們不想補充或者需要更換補充的時候,直接操作AOP即可。
1、Pointcut: 切點,用于定義哪個方法會被攔截,例如 execution(* cn.springcamp.springaop.service..(…))

2、Advice: 攔截到方法后要執行的動作

3、Aspect: 切面,把Pointcut和Advice組合在一起形成一個切面

4、Join Point: 在執行時Pointcut的一個實例

4、Weaver: 實現AOP的框架,例如 AspectJ 或 Spring AOP

一、SpringBoot項目引入AOP依賴

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

啟動類加上@EnableAspectJAutoProxy注解,可以省略。因為在AOP的默認配置屬性中,spring.aop.auto屬性默認是開啟的。
也不需要再引入AspectJ依賴了。

二、普通方式

切面類代碼:

package com.example.myblog.test;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AOPTest {
    //定義切入點
    @Pointcut("execution(public * com.example.myblog.test.AOPTestClient.*(..))")
    public void aspectTest(){}

    //前置通知,切入點執行之前執行
    @Before("aspectTest()")
    public void doBefore(JoinPoint joinPoint){
        System.out.println("前置通知");
    }
    //后置通知,切入點執行之后執行
    @After("aspectTest()")
    public void doAfter(JoinPoint joinPoint){
        System.out.println("后置通知");
    }
    //最終通知,,切入點執行之后執行
    @AfterReturning("aspectTest()")
    public void doAfterReturning(JoinPoint joinPoint){
        System.out.println("最終通知");
    }
    //異常通知,切入點拋出異常執行
    @AfterThrowing("aspectTest()")
    public void deAfterThrowing(JoinPoint joinPoint){
        System.out.println("異常通知");
    }
    //環繞通知,切入點執行前、后執行
    @Around("aspectTest()")
    public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("未執行");
        Object result = joinPoint.proceed();
        System.out.println("已執行");
        //返回結果
        return result;
    }
}

切點類代碼:

package com.example.myblog.test;

import org.springframework.stereotype.Component;

@Component
public class AOPTestClient {
    public void test(){
        System.out.println("正在測試AOP");
    }
}

測試類代碼:

package com.example.myblog;

import com.example.myblog.test.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class MyblogApplicationTests {
    
    @Autowired
    private AOPTestClient aopTestClient;

    @Test
    public void testAOP(){
        aopTestClient.test();
    }
}

測試結果:

SpringBoot項目怎么使用aop

三、注解方式

自定義注解代碼:

package com.example.myblog.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//表示次注解可以標注在類和方法上
@Target({ElementType.METHOD, ElementType.TYPE})
//運行時生效
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    //定義一個變量,可以接受參數
    String desc() default " ";
}

切面類代碼:

package com.example.myblog.test;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class AOPAnnotationTest {
    //定義切入點
    @Pointcut("@annotation(com.example.myblog.test.MyAnnotation)")
    public void aspectTest(){}

    //前置通知,切入點執行之前執行
    @Before("aspectTest()")
    public void doBefore(JoinPoint joinPoint){
        System.out.println("前置通知");
    }
    //后置通知,切入點執行之后執行
    @After("aspectTest()")
    public void doAfter(JoinPoint joinPoint){
        System.out.println("后置通知");
    }
    //最終通知,,切入點執行之后執行
    @AfterReturning("aspectTest()")
    public void doAfterReturning(JoinPoint joinPoint){
        System.out.println("最終通知");
    }
    //異常通知,切入點拋出異常執行
    @AfterThrowing("aspectTest()")
    public void deAfterThrowing(JoinPoint joinPoint){
        System.out.println("異常通知");
    }
    //環繞通知,切入點執行前、后執行
    @Around("aspectTest()")
    public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("未執行");
        Object result = joinPoint.proceed();
        System.out.println("已執行");
        //返回結果
        return result;
    }
}

切點類代碼:

package com.example.myblog.test;

import org.springframework.stereotype.Component;

@Component
public class AOPAnnotationTestClient {
    @MyAnnotation
    public void test(){
        System.out.println("正在測試AOP");
    }
}

測試類代碼:

@Test
    public void testAOPAnnotation(){
        aopAnnotationTestClient.test();
    }

測試結果:

SpringBoot項目怎么使用aop

以上就是關于“SpringBoot項目怎么使用aop”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

班玛县| 张家口市| 小金县| 内丘县| 九江县| 隆回县| 荥经县| 余江县| 赤城县| 新和县| 汕尾市| 锦州市| 申扎县| 太谷县| 长顺县| 乌什县| 兴化市| 西峡县| 定边县| 昌图县| 新郑市| 荣成市| 天峨县| 武胜县| 会东县| 江山市| 彝良县| 浮山县| 兴仁县| 斗六市| 延长县| 隆昌县| 昂仁县| 平阳县| 泾源县| 周至县| 灌南县| 黄平县| 五寨县| 广宁县| 芮城县|