这是我参与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())") 部分
我们先看一下我们的目录结构
主要的类我们都已经标红,之后我们再说一下我们刚刚的问题
- 我们的参数可以用
"execution(public * com.example.oj.controller.testCon.tt(..))"的方式代替,就说明,可以是任意参数 - 方法名
"execution(public * com.example.oj.controller.testCon.*(..))"在我们testCon类下任意方法,任意参数 - 类名
"execution(public * com.example.oj.controller.*.*(..))"在我们controller包下任意类,任意方法,任意参数 - 类型,我们在这个*号可以指明他是什么类型的,譬如 int,String之类
- 最后,最重要的就是
"execution(public * com.example.oj.controller..*.*(..))"我们仔细看它与我们第三条中的差距,我们比他多了一个点,这就说明是在controller包下以及子包下的任意类,任意方法,任意参数