一、Spring AOP 的一些核心概念
概念 | 含义 | 备注 |
---|---|---|
Aspect | 切面 | 表示在当前类中操作切面 |
Join Point | 连接点,Spring AOP里总代表一次方法执行 | 添加Advice 相关注解的方法,在方法中处理业务逻辑 |
Advice | 通知,在连接点执行的动作 | @Before、@AfterReturning、 @AfterThrowing、 @After、@Around |
Pointcut | 切入点,说明如何匹配连接点 | 匹配哪些类或方法或参数被拦截,可用的表达式:execution、within、this、target、@target、@args、@within、 |
Introduction | 引入,为现有的类型声明额外的方法和属性 | 可以通过@DeclareParents注解通过名称引入接口 |
Target object | 目标对象 | 被拦截代理的对象 |
AOP proxy | AOP代理对象,可以是JDK动态代理,也可以是GCLIB代理 | 详见:https://mp.csdn.net/mdeditor/92789301# |
Weaving | 织入,连接切面与目标对象或类型创建代理的过程 |
二、AOP 用于打印日志
- 在配置类中启用动态代理 @EnableAspectJAutoProxy
2)定义切面 @Aspect
3)@Around 方式直接拦截对应的对象(二选一)
4)@Around + @Pointcut 方式拦截对应的对象(二选一)
三、使用注意事项
1)@Around 可以处理方法的 整个执行过程是最常用的
2)@Around 必须返回 ,官方demo
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;
@Aspect
public class AroundExample {
@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}
}
3)@Before、 @After 等不用返回值,官方demo
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.After;
@Aspect
public class AfterFinallyExample {
@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
public void doReleaseLock() {
// ...
}
}
四、Spring 中对aop 常见封装应用(around advice)
public class DebugInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Before: invocation=[" + invocation + "]");
Object rval = invocation.proceed();
System.out.println("Invocation returned");
return rval;
}
}
注意:MethodInterceptor 是 “Cglib动态代理” 方式实现的, 非jdk的动态代理。