初始化一个基础的 aop 程序
// 作为演示程序,没有更具体的方法体 @slf4j @component @aspect public class tryaspect { @before("execution(* biz.baijing.service.impl.deptserviceimpl.*(..))") // * 任意方法 , .. 形参任意 public void before(){ log.info("before ..."); } public void after(){ log.info("after ..."); } public void around(){ log.info("around before ..."); // 调用目标方法 log.info("around after"); } public void afterreturning(){ log.info("afterreturning ..."); } public void afterthrowing(){ log.info("after throwing ..."); } }
before
注意编辑器这个位置的 m 的变化。
点击 m 提示了
@before("execution(* biz.baijing.service.impl.deptserviceimpl.*(..))")
切面目标的方法。
around
before 是半圆;around 是完整的圆形。
同样点击会出现 execution 的指向的目标方法
注解: m = methods
对 around 方法,完善之后
@around("execution(* biz.baijing.service.impl.deptserviceimpl.*(..))") public object around(proceedingjoinpoint proceedingjoinpoint) throws throwable{ log.info("around before ..."); // 调用目标方法 object proceed = proceedingjoinpoint.proceed(); log.info("around after"); return proceed; }
advise — 通知
方法体,是抽取的一组公共的实现逻辑。
log.info("around before ..."); // 调用目标方法 object proceed = proceedingjoinpoint.proceed(); log.info("around after"); return proceed;
pointcut — 切入点
方法实际针对的目标方法的引入,是aop方法和目标类方法的连接;
通过切入点表达式关联。
"execution(* biz.baijing.service.impl.deptserviceimpl.*(..))"
备注: * : 所有 deptserviceimpl 下的方法 ; .. : 形参任意。
acpect — 切面
advise 和 pointcut 的连接。
@around("execution(* biz.baijing.service.impl.deptserviceimpl.*(..))") public object around(proceedingjoinpoint proceedingjoinpoint) throws throwable{ log.info("around before ..."); // 调用目标方法 object proceed = proceedingjoinpoint.proceed(); log.info("around after"); return proceed; }
描述这个方法的类,就叫: 切面类。
@slf4j @component @aspect public class tryaspect { @before("execution(* biz.baijing.service.impl.deptserviceimpl.*(..))") // * 任意方法 , .. 形参任意 public void before(){ log.info("before ..."); } public void after(){ log.info("after ..."); } @around("execution(* biz.baijing.service.impl.deptserviceimpl.*(..))") public object around(proceedingjoinpoint proceedingjoinpoint) throws throwable{ log.info("around before ..."); // 调用目标方法 object proceed = proceedingjoinpoint.proceed(); log.info("around after"); return proceed; } public void afterreturning(){ log.info("afterreturning ..."); } public void afterthrowing(){ log.info("after throwing ..."); } }
tryaspect —— 切面类。
target — 目标对象
biz.baijing.service.impl.deptserviceimpl
deptserviceimpl —— 就是目标对象。
joinpoint — 连接点
被 aop 控制的对象方法,即:
biz.baijing.service.impl.deptserviceimpl
下的所有方法
这里被 红色 m 标识的方法就是 joinpoint 。
结果
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论