亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

Springboot怎么用Aop捕捉注解實現業務異步執行

發布時間:2023-04-03 11:25:29 來源:億速云 閱讀:171 作者:iii 欄目:開發技術

這篇“Springboot怎么用Aop捕捉注解實現業務異步執行”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Springboot怎么用Aop捕捉注解實現業務異步執行”文章吧。

一、先說說線程的幾種創建方式(簡要列舉)

1、繼承Thread類,復寫run方法:

public class ExtendsThread extends Thread{
    @Override
    public void run() {
        try{
            System.out.println(Thread.currentThread().getName()+"執行");
        }catch (Exception e){
 
        }
    }
    public static void main(String[] args) {
        new Thread(new ExtendsThread()).start();
    }
}

2、實現Runnable接口,重寫run方法:

public class ImplementsRunnable implements Runnable{
    @Override
    public void run() {
        try{
            System.out.println(Thread.currentThread().getName()+"執行");
        }catch (Exception e){
 
        }
    }
    public static void main(String[] args) {
        new Thread(new ImplementsRunnable()).start();
        //這里還可以使用匿名內部類的寫法創建一個線程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"執行");
            }
        },"匿名內部類實現Runnable接口的線程");
    }
}

3、實現Callable接口,使用FutureTask創建線程(可以獲得返回值):

public class CallableAndFuture implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(3000);
        System.out.println(Thread.currentThread().getName()+"執行");
        return "success";
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<>(new CallableAndFuture());
//        futureTask.run();   主線程執行call方法
        new Thread(futureTask).start();
        String result = futureTask.get();
        System.out.println(result);
    }
}

4、使用線程池創建線程(這里利用提供的線程池框架Executors創建線程池):

public class Executor {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"執行");
            }
        });
    }
}

二、再聊一聊spring自帶的@Async注解實現異步任務的方法

其實很簡單,就是在應用程序啟動類上打@EnableAsync注解開啟異步注解的使用,再在業務類的某個方法上打@Async即可。

@SpringBootApplication
@EnableAsync
public class AopApplication {
    public static void main(String[] args) {
        SpringApplication.run(AopApplication.class, args);
    }
}

業務類方法(舉例):

   @Async
    public void insertDb(){
        /*service code......*/
        System.out.println("2----->收到請求,寫入數據庫  ");
    }

三、那么就來設計一下怎么使用自定義的注解實現異步任務

首先我們寫一個注解:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAsync {
    //規定value是異步開關
    boolean value() default false;
}

我們讓注解中的value的值定為布爾類型,從而根據它的真假來決定異步線程的創建。

我們將它打在業務類的方法上:

  @MyAsync(value = true)
    public void deleteDb(){
        /*service code......*/
        System.out.println("delete------>數據刪除");
    }

然后我們利用AOP掃描這個注解:

Aspect
@Component
public class AopUtils {
    @Around(value = "@annotation(com.example.aop.Aop異步.MyAsync)")
    public void listenMyAsync(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        MyAsync annotation = method.getAnnotation(MyAsync.class);
        boolean value = annotation.value();
        if (value)
            new Thread(new Runnable() {
                @SneakyThrows
                @Override
                public void run() {
                    joinPoint.proceed();
                }
            }).start();
        else
            joinPoint.proceed();
    }
}

我們可以看到利用Around尋找執行的線程中某個含有注解的方法棧,捕捉到之后就可以獲得對應的連接點對象了。

利用可通過連接點對象ProcedJoinPoint的getSignture方法獲取簽名,可以將簽名強制轉化成方法簽名MethdSignture類型,從而利用該類型的getMethod方法獲取方法本身,接下來就可以獲取方法的注解,利用注解的屬性直接獲取value的真假,從而決定方法通過的方式是同步的還是異步的。(源碼利用到反射機制)。

以上就是關于“Springboot怎么用Aop捕捉注解實現業務異步執行”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

昭通市| 宿州市| 隆昌县| 呼伦贝尔市| 宜阳县| 滁州市| 南开区| 民丰县| 六枝特区| 定安县| 常德市| 馆陶县| 铜川市| 安远县| 榕江县| 高碑店市| 汝南县| 阿巴嘎旗| 铜梁县| 富民县| 乐亭县| 抚顺县| 海城市| 突泉县| 通榆县| 佳木斯市| 九江县| 扎鲁特旗| 肃北| 封开县| 昌乐县| 新化县| 嘉定区| 皮山县| 醴陵市| 五台县| 青铜峡市| 衡阳县| 蒲城县| 上犹县| 江油市|