执行流程:
Aop
http请求
环绕通知开始
目标方法
环绕通知结束
代码如下:
1.自定义注解
package com.example.zmtestpj.config;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author zm
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MayiktAsync {
}
2.AOP环绕通知
package com.example.zmtestpj.config;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Aspect
@Component
public class ExtMayiktThreadAop {
@Around(value = "@annotation(com.example.zmtestpj.config.MayiktAsync)")
public void around(ProceedingJoinPoint joinPoint) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> {
try {
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
});
}
}
3.service层
package com.example.zmtestpj.service;
import com.example.zmtestpj.config.MayiktAsync;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author zm
*/
@Service
@Slf4j
public class OrderService {
@MayiktAsync
public void asyncLog() {
try {
Thread.sleep(3000);
log.info("<2>");
} catch (Exception e) {
}
}
}
4.web层
package com.example.zmtestpj.web;
import com.example.zmtestpj.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/zmAsyncWeb")
@Slf4j
public class zmAsyncWeb {
@Autowired
private OrderService orderService;
//http://127.0.0.1:8083/zmtest/zmAsyncWeb/zmThreadAsync
@RequestMapping(value = "/zmThreadAsync", method = RequestMethod.GET)
public String zmThreadAsync(){
log.info("<1>");
orderService.asyncLog();
log.info("<3>");
log.info("<4>");
return "ok";
}
}
效果如下访问:
http://127.0.0.1:8083/zmtest/zmAsyncWeb/zmThreadAsync
日志打印的<2>单独开启了线程执行