AOP思想目的是为了提高代码的模块化程度,不修改现有代码的基础上动态的去执行和变化代码中的逻辑。
全称为:面向切面编程(Aspect Oriented Programming), 而在想要扩展新功能的位置,称为**"切入点",** 新功能业务逻辑代码称为**"切面"。**
和动态代理是不是非常像,其实就是基于动态代理技术实现的,在运行是创建切入点的代理对象,这些代理对象会来拦截原本切入点对象的方法的调用,并在方法执行前后执行切面的逻辑。
@Aspect 是一个独立的AOP框架,spring对他做了支持,
@EnableAspectJAutoProxy注解启用了对这个框架的支持
概念:

几种场景:
权限校验拦截器:

实际上spring的拦截器底层就是利用AOP思想来实现的

简答代码展示:
Aspect类说明了变化的代码逻辑:
java
@Aspect
@Component
@Order(-1)
public class NameAspect {
private static final Logger logger = LoggerFactory.getLogger(NameAspect.class);
@Pointcut("@annotation(com.openapi.weekcode.annotation.name)")
public void start(){
}
@Before("@annotation(name)")
public void before(JoinPoint joinPoint, name name){
String myname = name.value();
logger.info("Hi, my name is " + myname);
}
@After("@annotation(name)")
public void after(JoinPoint joinPoint, name name){
String myname = name.value();
logger.info("Bye, my name is " + myname);
}
@AfterReturning(value = "@annotation(name)",returning = "result")
public void afterReturning(JoinPoint joinPoint, name name, Object result){
if (result instanceof Response){
Response<String> response = (Response<String>) result;
response.setData("Modified function!");
}
}
}
注解类:
java
package com.openapi.weekcode.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface name {
String value() default "";
}
简单的controller代码:
java
@name(value = "junhqin")
@PostMapping("/list")
public Response list(){
Response<String> response = new Response<>("original function!");
return response;
}
结果:


思考
对于一个框架最重要的是如何满足快速搭建业务功能的需求,因此springboot的量大特性:IOC和AOP正好满足"业务功能拓展"和"性能消耗管理"。