sping aop 源码分析

Posted yangxiaohui227

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sping aop 源码分析相关的知识,希望对你有一定的参考价值。

测试项目已上传到码云,可以下载:https://gitee.com/yangxioahui/aopdemo.git

具体如下:

public interface Calc {
    Integer add(int num1,int num2);
}
//目标是对add 方法进行切入 @Component
public class MyMath implements Calc { public Integer add(int num1,int num2){ return num1+num2; } } @Aspect @Component public class MyAspectJ { @Pointcut(" execution(* com.yang.xiao.hui.aop.MyMath.*(..))") private void pointcut(){} @Before(value = "pointcut()") public void before(JoinPoint joinPoint){ System.out.println("before。。。。。"); } @After(value = "pointcut()") public void after(JoinPoint joinPoint){ System.out.println("after。。。。"); } @AfterReturning(value = "pointcut()") public void afterReturning(){ System.out.println("afterReturning。。。"); } @AfterThrowing(value = "pointcut()") public void afterThrowing(JoinPoint joinPoint){ System.out.println("afterThrowing。。。。"); } @Around(value ="pointcut()") public void around(ProceedingJoinPoint joinPoint){ System.out.println("around-before。。。。"); try { Object proceed = joinPoint.proceed(); System.out.println("around-after_return。。。"); } catch (Throwable throwable) { System.out.println("around-throw。。。"+throwable.getMessage()); } System.out.println("around-after。。。"); } } //测试类 @Configuration @ComponentScan("com.yang.xiao.hui.aop") @EnableAspectJAutoProxy(exposeProxy = true) public class App { public static void main( String[] args ) { ApplicationContext ctx = new AnnotationConfigApplicationContext(App.class); Calc myMath = (Calc)ctx.getBean("myMath"); myMath.add(3,5); System.out.println(ctx.getBean("myMath").getClass()); } }

 启动项目结果:

技术图片

  至此,测试环境搭建完毕

原理分析:
我们要对MyMath 类的add 方法进行前后代理,我们也可以自己实现:

技术图片

 

 我们实现的叫静态代理,如果是程序实现的叫动态代理;切入的方式有前置切入,后置切入等,切入点有切入表达式(Pointcut),在java中,一切皆对象,spring将各种切入方式叫做Advice(增强器),如BeforeAdvice,而我们是通过方法切入

所以又叫MethodBeforeAdvice:

技术图片

 

单有一个Advice 我们并不知道要给哪个类进行切入,因此还需要切入点,于是我们将Advice和切入点Pointcut 结合一起组成一个Advisor:

 例如:DefaultPointcutAdvisor它的构造器:

技术图片

 

 一个被切入的类,它的代理类,会有很多个Advisor,那么我们称这个代理类叫做Advised:

技术图片

 

 至此,我们知道了advice ,advisor 和advised的三者之间的关系了:
下面的我们要解决的问题是:1.各种切入方式是如何被封装成advisor的 2 如何知道某个类是否需要被代理 3. 如何创建代理类 4 类被代理后,目标方法是如何执行的:

技术图片

 

 

 


 

 

 

 


 

 

 

 

 

 

 

 

以上是关于sping aop 源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Sping中的AOP

Sping之AOP思想

SpringBoot 源码解析 ----- Spring Boot 精髓:集成AOP

Sping源码——循环依赖

Sping源码——循环依赖

Sping源码——循环依赖