Spring——AOP实现原理(基于JDK和CGLIB)

Posted 杨晨光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring——AOP实现原理(基于JDK和CGLIB)相关的知识,希望对你有一定的参考价值。

本文转自:http://blog.csdn.net/luanlouis/article/details/51155821


0、前言

     在上篇文章 《Spring设计思想》AOP设计基本原理  中阐述了Spring AOP 的基本原理以及基本机制,本文将深入源码,详细阐述整个Spring AOP实现的整个过程。

    

读完本文,你将了解到
1、Spring内部创建代理对象的过程
2、Spring AOP的核心---ProxyFactoryBean
3、基于JDK面向接口的动态代理JdkDynamicAopProxy生成代理对象
4、基于Cglib子类继承方式的动态代理CglibAopProxy生成代理对象
5、各种Advice是的执行顺序是如何和方法调用进行结合的?
6、PointCut与Advice的结合------Adivce的条件执行
7、总结

1、Spring内部创建代理对象的过程

            在Spring的底层,如果我们配置了代理模式,Spring会为每一个Bean创建一个对应的ProxyFactoryBeanFactoryBean来创建某个对象的代理对象。

            假定我们现在有一个接口TicketService及其实现类RailwayStation,我们打算创建一个代理类,在执行TicketService的方法时的各个阶段,插入对应的业务代码。

[java]  view plain  copy  print ?
  1. package org.luanlouis.meditations.thinkinginspring.aop;  
  2.   
  3. /** 
  4.  * 售票服务 
  5.  * Created by louis on 2016/4/14. 
  6.  */  
  7. public interface TicketService   
  8.   
  9.     //售票  
  10.     public void sellTicket();  
  11.   
  12.     //问询  
  13.     public void inquire();  
  14.   
  15.     //退票  
  16.     public void withdraw();  
  17.   

[java]  view plain  copy  print ?
  1. package org.luanlouis.meditations.thinkinginspring.aop;  
  2.   
  3. /** 
  4.  * RailwayStation 实现 TicketService 
  5.  * Created by louis on 2016/4/14. 
  6.  */  
  7. public class RailwayStation implements TicketService   
  8.   
  9.     public void sellTicket()  
  10.         System.out.println("售票............");  
  11.       
  12.   
  13.     public void inquire()   
  14.         System.out.println("问询.............");  
  15.       
  16.   
  17.     public void withdraw()   
  18.         System.out.println("退票.............");  
  19.       
  20.   

[java]  view plain  copy  print ?
  1. package org.luanlouis.meditations.thinkinginspring.aop;  
  2.   
  3. import org.springframework.aop.MethodBeforeAdvice;  
  4.   
  5. import java.lang.reflect.Method;  
  6.   
  7. /** 
  8.  * 执行RealSubject对象的方法之前的处理意见 
  9.  * Created by louis on 2016/4/14. 
  10.  */  
  11. public class TicketServiceBeforeAdvice implements MethodBeforeAdvice   
  12.   
  13.     public void before(Method method, Object[] args, Object target) throws Throwable   
  14.         System.out.println("BEFORE_ADVICE: 欢迎光临代售点....");  
  15.       
  16.   

[java]  view plain  copy  print ?
  1. package org.luanlouis.meditations.thinkinginspring.aop;  
  2.   
  3. import org.springframework.aop.AfterReturningAdvice;  
  4.   
  5. import java.lang.reflect.Method;  
  6.   
  7. /** 
  8.  * 返回结果时后的处理意见 
  9.  * Created by louis on 2016/4/14. 
  10.  */  
  11. public class TicketServiceAfterReturningAdvice implements AfterReturningAdvice   
  12.     @Override  
  13.     public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable   
  14.         System.out.println("AFTER_RETURNING:本次服务已结束....");  
  15.       
  16.   

[java]  view plain  copy  print ?
  1. package org.luanlouis.meditations.thinkinginspring.aop;  
  2.   
  3. import org.springframework.aop.ThrowsAdvice;  
  4.   
  5. import java.lang.reflect.Method;  
  6.   
  7. /** 
  8.  * 抛出异常时的处理意见 
  9.  * Created by louis on 2016/4/14. 
  10.  */  
  11. public class TicketServiceThrowsAdvice implements ThrowsAdvice   
  12.   
  13.     public void afterThrowing(Exception ex)  
  14.         System.out.println("AFTER_THROWING....");  
  15.       
  16. Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口

    Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口

    spring - aop动态代理的原理案例实现

    每日一学之认识Spring中的AOP

    spring AOP原理

    Spring框架学习06——AOP底层实现原理