AOP学习笔记
为什么使用AOP?AOP能解决什么问题?
AOP:面向切面编程
简单来说,就是为了在基础功能上再增加一部分功能。
为了实现这个目的,我们可以简单的在原来的功能上,进行代码的增加或者删改,但是这样违背了开放封闭原则。
所以,我们可以通过AOP来实现将核心业务和边缘业务进行拆分。
应用场景:打印日志,安全控制,权限管理,性能分析等等。
鱼皮的API项目中,就使用AOP实现了,打印日志和权限管理。
怎么样使用AOP呢?
在SpringBoot项目中,我们只需要知道以下几个常用的注解,就可以对于AOP进行简单使用了
- 引入AOP的依赖
- 定义切面类(@Aspect)
- 定义切点(@Pointcut)
- 定义通知(@Around,@After,@Before,省略一些不常用的)
切点:是定义了在“什么地方”进行切入,哪些连接点会得到通知。说人话就是,指定你需要在哪个方法前后增加功能。
通知:包含了需要用于多个应用对象的横切行为。说人话就是,你给需要增强的方法,前面还是后面,增加什么功能这个就是通知干的。
切面:通知和切点共同定义了切面的全部内容。说人话就是,切点+通知。
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
切面
这里将给出一个简单Demo进行说明
这是一个简单的hello请求
@RestController
@RequestMapping("/aop")
public class AopController {
// http://localhost:8080/aop/hello
@RequestMapping("/hello")
public UserVo sayHello(){
System.out.println("hello");
UserVo userVo = new UserVo();
userVo.setName("tianzhao");
userVo.setAge("18");
//将userVo返回给网页
return userVo;
}
}
这是定义一个切面
@Aspect
@Component
public class AopAdvice {
@Pointcut("execution (* com.example.aopdemo.AopController.*(..))")
public void test() {
//不执行
System.out.println("test.....");
}
@Before("test()")
public void beforeAdvice() {
System.out.println("beforeAdvice...");
}
@After("test()")
public void afterAdvice() {
System.out.println("afterAdvice...");
}
//可以直接使用Object代表返回类型,直接返回函数调用结果即可
@Around("test()")
public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
System.out.println("before");
try {
//调用通知的方法,并且还需要返回方法的值。
return proceedingJoinPoint.proceed();
} catch (Throwable t) {
t.printStackTrace();
}
System.out.println("after");
return null;
}
}
切点表达式:指定你要切入到哪里

还有其他的切入规则,我这里只说明最简单的一种。
通知类型
- 前置通知(@Before):在目标方法调用之前调用通知
- 后置通知(@After):在目标方法完成之后调用通知
- 环绕通知(@Around):在被通知的方法调用之前和调用之后执行自定义的方法
- 返回通知(@AfterReturning):在目标方法成功执行之后调用通知
- 异常通知(@AfterThrowing):在目标方法抛出异常之后调用通知
推荐参考文档
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
