17.Springboot中的Aop编程

Posted 结构化思维wz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    
        }
    
    }
    
    

在这里插入图片描述

以上是关于17.Springboot中的Aop编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

每日一学之认识Spring中的AOP

JavaScript中的AOP编程

JavaScript中的AOP编程

Java——面向切面编程,Spring中的AOP编程