天天看点

【spring源码学习】spring的AOP面向切面编程的实现解析

一:Advice(通知)

(1)定义在连接点做什么,为切面增强提供织入接口。在spring aop中主要描述围绕方法调用而注入的切面行为。

(2)spring定义了几个时刻织入增强行为的接口

  =>org.springframework.aop.BeforeAdvice

   org.springframework.aop.MethodBeforeAdvice

  =>org.springframework.aop.AfterAdvice

   org.springframework.aop.AfterReturningAdvice

  =>org.springframework.aop.ThrowsAdvice

二:PointCut(切点)

(1)决定Advice应该作用那些连接点。也就是说通过PointCut来定义需要增强的方法集合。

(2)spring定义的PointCut的接口

  =>org.springframework.aop.Pointcut

  =>org.springframework.aop.TruePointcut

  => org.springframework.aop.support.JdkRegexpMethodPointcut

(3)相关接口。PointCut接口会返回两个对象,一个ClassFilter,一个是MethodMatcher

  =>org.springframework.aop.ClassFilter    

  =>org.springframework.aop.TrueClassFilter

  =>org.springframework.aop.MethodMatcher  匹配当前方法是否需要执行增强逻辑,也就是是否需要执行Advice接口的方法。

  =>org.springframework.aop.TrueMethodMatcher

三:通知器皿(Advisor)

  (1)完成对目标方法的切面增强设计(advice)和关注点的设计(PoinCut)以后,需要一个对象把他们结合起来,完成这个作用的就是(Advisor)

  (2)spring定义的Advisor接口

  =>org.springframework.aop.Advisor

  =>org.springframework.aop.support.DefaultPointcutAdvisor

  (3)Advisor的控制器的接口

  =>org.springframework.aop.framework.adapter.AdvisorAdapter

  =>org.springframework.aop.framework.adapter.AfterReturningAdviceAdapter  目标方法执行完执行该增强的控制器

  =>org.springframework.aop.framework.adapter.MethodBeforeAdviceAdapter  目标方法未执行前执行该增强的控制器

  =>org.springframework.aop.framework.adapter.ThrowsAdviceAdapter   目标方法执行过程抛出异常执行该增强的控制器

四:springAop的相关

  (1)springAop的核心技术是动态代理。动态代理的技术是jdk的一个特征。

  (2)springAop的代理对象生成案例

    =>org.springframework.aop.framework.ProxyFactoryBean

    =>org.springframework.aop.framework.ProxyFactory

五:ProxyFactoryBean的工作流程。

(1)实现FactoryBean接口的类,在想IOC容器申请bean的时候,其实返回的是该类执行getObject()方法的返回。

(2)ProxyFactoryBean的getObject()方法返回的是目标对象的代理对象。

  其执行过程

  =>根据配置的interceptorNames的属性值先初始化代理增强的链子.根据interceptorNames从IOC容器中得到增强类的bean,然后判断其类型,形成DefaultPointcutAdvisor对象。

  =>根据配置的targetName属性值从IOC容器中得到目标对象的bean,形成一个SingletonTargetSource对象。

  =>将其本身作为一个aop代理对象创建的数据配置类,创建一个动态代理对象,返回给ioc容器申请。

(3)在执行目标对象的方法过程中,会根据执行的方法的对象,从代理链子里找到所有的Advisor对象,然后利用其属性Pointcut对象获取ClassFilter, MethodMatcher来判断当前Advisor是否要执行。如果执行,则加入执行代理链子中。以jdk动态代理为例子,是org.springframework.aop.framework.JdkDynamicAopProxy类中invoke(Object proxy, Method method, Object[] args)方法中这句代码List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);。该句代码中this.advised其实就是ProxyFactoryBean本身。

六案例

一:Advice的对象

【spring源码学习】spring的AOP面向切面编程的实现解析
【spring源码学习】spring的AOP面向切面编程的实现解析

View Code

二:目标对象

【spring源码学习】spring的AOP面向切面编程的实现解析
【spring源码学习】spring的AOP面向切面编程的实现解析

三:配置文件

【spring源码学习】spring的AOP面向切面编程的实现解析
【spring源码学习】spring的AOP面向切面编程的实现解析

七:spring内部基于该中方式实现动态代理的案例。spring提供的HttpInvoker远程调用.可以阅读该类getObject方法。实现对Facade接口代理

org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean