写点什么

你知道面试必问的 AOP 吗?通过 Spring 又如何实现呢?

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:1438 字

    阅读完需:约 5 分钟

jar 包坐标引入


<dependency>


<groupId>org.aspectj</groupId>


<artifactId>aspectjweaver</artifactId>


<version>1.8.9</version>


</dependency>


beans.xml 配置


添加命名空间


xmlns:aop="http://www.springframework.org/schema/aop"


http://www.springframework.org/schema/aop


http://www.springframework.org/schema/aop/spring-aop.xsd


配置 Aop 代理


aop:aspectj-autoproxy/


编写 aop 实现类


/**


  • 声明切面组件


*/


@Component


@Aspect


public class LogCut {


/**


  • 定义切入点 匹配方法规则定义

  • 匹配规则表达式含义 拦截 com.xxx.service 包下 以及子包下 所有类的所有方法


*/


@Pointcut("execution (* com.xxx.service...(..))")


public void cut(){}


/**


  • 声明前置通知 并将通知应用到定义的切入点上

  • 目标类方法执行前 执行该通知


*/


@Before(value="cut()")


public void before(){


System.out.println("前置通知.....");


}


/**


  • 声明返回通知 并将通知应用到切入点上

  • 目标类方法执行完毕执行该通知


*/


@AfterReturning(value="cut()")


public void afterReturning(){


System.out.println("返回通知....");


}


/**


  • 声明最终通知 并将通知应用到切入点上

  • 目标类方法执行过程中是否发生异常 均会执行该通知 相当于异常中的 finally


*/


@After(value="cut()")


public void after(){


System.out.println("最终通知....");


}


/**


  • 声明异常通知 并将通知应用到切入点上

  • 目标类方法执行时发生异常 执行该通知


*/


@AfterThrowing(value="cut()",throwing="e")


public void afterThrowing(Exception e){


System.out.println("异常通知....方法执行异常时执行:"+e);


}


/**


  • 声明环绕通知 并将通知应用到切入点上

  • 方法执行前后 通过环绕通知定义相应处理


*/


@Around(value="cut()")


public Object around(ProceedingJoinPoint pjp) throws Throwable{


System.out.println("环绕前置...");


System.out.println("环绕通知");


System.out.println(pjp.getTarget()+"--"+pjp.getSignature());


Object result=pjp.proceed();//执行目标对象方法


System.out.println("环绕后置...");


return result;


}


}


Aop 匹配方法规则表达式语言(简要了解)


Aop 切入点表达式简介


执行任意公共方法:


execution(public *(..))


执行任意的 set 方法


execution(* set*(..))


执行 com.xxx.service 包下任意类的任意方法


execution(* com.xxx.service..(..))


执行 com.xxx.service 包 以及子包下任意类的任意方法


execution(* com.xxx.service...(..))


xml 方式


配置切面、切入点、通知


aop:config


<aop:a


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


spect ref="logCut">


<aop:pointcut expression="execution (* com.xxx.service...(..))"


id="cut"/>


<aop:before method="before" pointcut-ref="cut"/>


<aop:after-returning method="afterReturning" pointcut-ref="cut"/>


<aop:after-throwing method="afterThrowing" throwing="e" pointcut-ref="cut"/>


<aop:after method="after" pointcut-ref="cut"/>


<aop:around method="around" pointcut-ref="cut"/>


</aop:aspect>


</aop:config>


定义 bean


/**


  • 声明切面组件


*/


@Component


public class LogCut {


public void before(){


System.out.println("前置通知.....");


}


public void afterReturning(){


System.out.println("返回通知....");


}


public void after(){


System.out.println("最终通知....");


}


public void afterThrowing(Exception e){


System.out.println("异常通知....方法执行异常时执行:" + e);


}

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
你知道面试必问的AOP吗?通过Spring又如何实现呢?