AOP学习笔记

为什么使用AOP?AOP能解决什么问题?


AOP:面向切面编程

简单来说,就是为了在基础功能上再增加一部分功能。

为了实现这个目的,我们可以简单的在原来的功能上,进行代码的增加或者删改,但是这样违背了开放封闭原则。

所以,我们可以通过AOP来实现将核心业务和边缘业务进行拆分。


应用场景:打印日志,安全控制,权限管理,性能分析等等。

鱼皮的API项目中,就使用AOP实现了,打印日志和权限管理。



怎么样使用AOP呢?


在SpringBoot项目中,我们只需要知道以下几个常用的注解,就可以对于AOP进行简单使用了

  1. 引入AOP的依赖
  2. 定义切面类(@Aspect)
  3. 定义切点(@Pointcut)
  4. 定义通知(@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;
}
}

切点表达式:指定你要切入到哪里

还有其他的切入规则,我这里只说明最简单的一种。


通知类型

  1. 前置通知(@Before):在目标方法调用之前调用通知
  2. 后置通知(@After):在目标方法完成之后调用通知
  3. 环绕通知(@Around):在被通知的方法调用之前和调用之后执行自定义的方法
  4. 返回通知(@AfterReturning):在目标方法成功执行之后调用通知
  5. 异常通知(@AfterThrowing):在目标方法抛出异常之后调用通知



推荐参考文档


SpringBoot AOP详解




0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
照
下载 APP