Como escrever à mão uma anotação assíncrona @Async
1. Anotações personalizadas
Personalize uma anotação @MyAsync, você pode copiar @Async
@Target({
ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAsync {
}
2. Escreva classes de aspecto AOP
@Aspect
@Component
public class MyAsyncAop {
@Around(value = "@annotation(org.sang.annotation.MyAsync)")
public Object around(ProceedingJoinPoint joinPoint) {
try {
System.out.println("环绕通知开始执行--");
new Thread(() -> {
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}).start();
System.out.println("环绕通知结束执行--");
} catch (Exception e) {
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
}
3. Escreva aulas de teste
classe do controlador:
@RequestMapping("/mysync")
public String mysync(){
System.out.println("-------------<1>--------------");
this.userService.asnycLog();
System.out.println("-------------<3>--------------");
return "success";
}
classe de serviço:
@MyAsync
public void asnycLog() {
try {
System.out.println("目标方法开始执行,正在阻塞3s----");
Thread.sleep(3000);
System.out.println("-------------<2>--------------");
}catch (Exception e){
}
}
Acesso local:
O resultado da impressão é o seguinte:
-------------<1>--------------
环绕通知开始执行--
环绕通知结束执行--
-------------<3>--------------
目标方法开始执行,正在阻塞3s----
-------------<2>--------------
4. Resumo
Como pode ser visto no log de impressão acima, quando o método asnycLog() do serviço é chamado do controlador, porque o método asnycLog() possui a anotação @MyAsync e a anotação @MyAsync possui uma notificação circundante definida no aop , um novo thread filho é iniciado.Execução, portanto, não há necessidade de esperar a execução do thread principal, alcançando assim a execução assíncrona. Portanto, a execução do thread principal é concluída, a execução do subthread é finalmente concluída e a execução do programa através do método anotado com @MyAsync é executada de forma assíncrona.