Springboot中的Aop编程
纯注解开发AOP
Spring AOP底层原理
不使用注解开发AOP
切入点:
修饰符 返回值 包.类.方法(参数)
* com.wangze.proxy.UserServiceImpl.login(..)
* com.wangze.proxy.UserServiceImpl.login(String,String)
使用场景:比如说可以监控每个方法的执行时间,可以直接添加切面,使用完后直接删除!
案例:
-
创建web项目
-
手动添加aop依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
-
需求:给service添加监控,让我们能看出来每个方法运行的时间
@Service public class UserService { public String getUserById(Integer id){ System.out.println("getUserById"); return "user"; } public void deleteUserById(Integer id){ System.out.println("deleteId"+id); } }
-
创建切面类
@Component @Aspect //表示当前类是一个切面 public class LogAspect { //表示这是一个切点,切点的定义方式有很多种,可以去原始方法上增加注解来定义,也可以指定 @Pointcut("execution(* com.example.aopstudy.service.*.*(..))") //这个切点不明白建议复习一下spring aop public void pc1(){ } //前置通知 @Before("pc1()") //指定pc1中指定的切入点 public void before(JoinPoint joinPoint){ String name = joinPoint.getSignature().getName();//获取方法名 System.out.println(name+"方法开始了...."); } //后置通知 @After("pc1()") //指定pc1中指定的切入点 public void After(JoinPoint joinPoint){ String name = joinPoint.getSignature().getName();//获取方法名 System.out.println(name+"方法结束了....."); } //返回通知,有返回值才能拿到 @AfterReturning(value = "pc1()",returning ="s") //指定pc1中指定的切入点,s为接受返回值,这里是string类型的,必须与返回的类型匹配 public void AfterReturning(JoinPoint joinPoint,String s){ String name = joinPoint.getSignature().getName();//获取方法名 System.out.println(name+"方法的返回值是"+s); } //异常通知 目标方法抛出异常的时候 @AfterThrowing(value = "pc1()",throwing = "e") public void afterThrowing(JoinPoint joinPoint,Exception e){ //异常类型也要跟目标方法一样 String name = joinPoint.getSignature().getName(); System.out.println(name+"抛出的异常名为"+e.getMessage()); } //环绕通知、 @Around("pc1()") public Object around(ProceedingJoinPoint proceedingJoinPoint){ try { //前置通知 Object proceed = proceedingJoinPoint.proceed(); //后置通知 return proceed; } catch (Throwable throwable) { //异常处理 throwable.printStackTrace(); } return null; }
-
单元测试
@SpringBootTest class AopStudyApplicationTests { @Autowired UserService userService; @Test void contextLoads() { userService.getUserById(99); } }