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 源码分析的主要内容,如果未能解决你的问题,请参考以下文章