Spring AOP 的一些核心概念
概念 | 含义 |
Aspect | 切面 |
Join Point | 连接点,Spring AOP里总是代表一次方法执行 |
Advice | 通知,在连接点执行的动作 |
Pointcut | 切入点,说明如何匹配连接点 |
Introduction | 引入,为现有类型生命额外的方法和属性 |
Target Object | 目标对象 |
AOP proxy | AOP代理对象,可以使JDK动态代理,也可以是CGLIB代理 |
Weaving | 织入,连接切面与目标对象或类型创建代理的过程 |
常用注解
@EnableAspectJAutoProxy
@Aspect //加在类上 声明该类是一个切面
@Pointcut // execution(public * *(..))、execution(* set*(..))、execution(* com.xyz.service.*.*(..))、
@Before
@After / @AfterReturning / @AfterThrowing
@Around
@Order
package com.example.ribi.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Slf4j
@Component
public class PerformanceAspect {
@Around("rpsoitoryOps()")
public Object logPerformance(ProceedingJoinPoint pjp) throws Throwable {
log.info(pjp.getSignature().toShortString());
log.info("===================================");
return pjp.proceed();
}
@Pointcut("execution(* com.example.ribi.*.*(..))")
private void rpsoitoryOps(){
}
}
-- 部分摘自 极客时间 玩转Spring全家桶
可以使用JoinPoint做一些其他的检验
JoinPoint的方法
Object getThis();
/ **
* <p>返回目标对象。这将永远是
*与<code> target </ code>切入点匹配的对象相同的对象
*指定人。除非你特别需要这种反射访问,
*你应该使用<code> target </ code>切入点指示符
*获取此对象以获得更好的静态类型和性能。</ p>
*
* <p>当没有目标对象时返回null。</ p>
* /
Object getTarget();
/ **
* <p>返回此连接点的参数。</ p>
* /
Object [] getArgs();
/ **返回连接点处的签名。
*
* <code> getStaticPart()。getSignature()</ code>返回相同的对象
* /
签名getSignature();
/ ** <p>返回与连接点对应的源位置。</ p>
*
* <p>如果没有可用的源位置,则返回null。</ p>
*
* <p>返回默认构造函数的定义类的SourceLocation。</ p>
*
* <p> <code> getStaticPart()。getSourceLocation()</ code>返回相同的对象。 </ p>
* /
SourceLocation getSourceLocation();
/ **返回表示连接点类型的String。这个
*保证字符串
*实习。 <code> getStaticPart()。getKind()</ code>返回
*同一个对象。
* /
String getKind();
... ...