您好,登錄后才能下訂單哦!
這篇“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()+"執行"); } }); } }
其實很簡單,就是在應用程序啟動類上打@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捕捉注解實現業務異步執行”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。