17.Springboot中的Aop编程

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);
    
        }
    
    }
    
    

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结构化思维wz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值