码迷,mamicode.com
首页 > 其他好文 > 详细

sping aop 源码分析

时间:2020-07-08 13:07:10      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:bean   obj   方式   npoi   read   before   exec   spec   程序实现   

测试项目已上传到码云,可以下载: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 源码分析

标签:bean   obj   方式   npoi   read   before   exec   spec   程序实现   

原文地址:https://www.cnblogs.com/yangxiaohui227/p/13266014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!