SpringBoot整合aop时出现的小问题

607 阅读2分钟

这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

今天因为一些功能需要,需要写一些aop,就遇到了一些奇奇怪怪的小问题,整理起来,如果大家遇到了,避免大家踩坑

首先,什么是Aop,这个。。我觉得应该不用说了吧

真实的第一步,导入我们的依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

我在使用Springboot的情况下,导入这一个依赖就好使,网上有的帖子还说要添加

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>

这个,大家,就可以按照其自己的情况而定

接下来,再去创建我们一个普通的测试类

@RestController
public class testCon {
    @GetMapping("tt")
    public String tt(){
        return "tt测试";
    }
}

之后去创建我们的切面类

@Aspect
@Component
public class MyAop {
    @Before("execution(public * com.example.oj.controller.testCon.tt())")
    public void testBefore(){
        System.out.println("Before--------");
    }
}

这里要注意,我们添加我们两个注解

@Aspect 这个是表示我们切面的注解

@Component 我们还需要把这个类,交给Spring容器去管理

在这个类中就有我们一个重点

就是@Before("execution(public * com.example.oj.controller.testCon.tt())") 部分

我们先看一下我们的目录结构

主要的类我们都已经标红,之后我们再说一下我们刚刚的问题

  1. 我们的参数可以用"execution(public * com.example.oj.controller.testCon.tt(..))" 的方式代替,就说明,可以是任意参数
  2. 方法名"execution(public * com.example.oj.controller.testCon.*(..))" 在我们testCon 类下任意方法,任意参数
  3. 类名"execution(public * com.example.oj.controller.*.*(..))" 在我们controller 包下任意类,任意方法,任意参数
  4. 类型,我们在这个*号可以指明他是什么类型的,譬如 int,String之类
  5. 最后,最重要的就是"execution(public * com.example.oj.controller..*.*(..))" 我们仔细看它与我们第三条中的差距,我们比他多了一个点,这就说明是在controller 包下以及子包下的任意类,任意方法,任意参数