Spring技术内幕——深入解析Spring架构与设计原理(二)AOP
AOP联盟定义的AOP体系结构把与AOP相关的概念大致分为了由高到低、从用法到实现的三个层次。关于这个体系结构,个人的理解是这样的,从上往下,最高层是语言和开发环境,在这个环境中可以看到几个重要的概念:base可以视为待增加对象,或者说目标对象;aspect指切面,通常包含对于base的增加应用;configuration可以看成是一种编织或者说配置,通过在AOP体系中提供这个configuration配置环境,可以把base和aspect结合起来,从而完成切面向目标对象的编织实现。 对Spring平台或者说生态系统来说,AOP是Spring框架的核心功能模块之一。AOP与IOC容器的结合用法, 为应用开发或者Spring自身功能的扩展都提供了许多方便。Spring AOP的实现和其他特性的实现一样,十分丰盛,除了可以用法Spring本身提供的AOP实现之外,还封装了业界优秀的AOP解决计划AspectJ来让应用用法。在这里,主要对Spring自身的AOP实现原理做一些解析;在这个AOP实现中,Spring充分利用了IOC容器Proxy代理对象以及AOP的功能特性,通过这些对AOP基本功能的封装机制,为用户提供了AOP的实现框架。所以,要了解这些AOP的基本实现,需要我们对Java 的Proxy机制有一些基本了解。 AOP实现的基本线索 AOP实现中,可以看到三个主要的步骤,一个是代理对象的生成,然后是的作用,然后是Aspect编织的实现。AOP框架的丰盛,很大程度体现在
这三个详细实现中,所具有的丰盛的技术挑选,以及如何实现与IOC容器的无缝结合。究竟这也是一个十分核心的模块,需要满足不同的应用需求带来的解决计划需求。 在Spring AOP的实现原理中,我们主要举ProxyFactoryBean的实现作为例子和实现的基本线索举行分析;很大一个缘由,是由于ProxyFactoryBean是在Spring IoC环境中,创建AOP应用的最底层办法,从中,可以看到一条实现AOP的基本线索。在ProxyFactoryBean中,它的AOP实现需要依靠JDK或者CGLIB提供的Proxy特性。从FactoryBean中猎取对象,是从getObject()办法作为入口完成的。然后为proxy代理对象配置advisor链,这个配置是在initializeAdvisorChain办法中完成的;然后就为生成AOP代理对象做好了预备,生成代理对象如下所示: private syhroniz Object getSingletonInstance() {  if (this.singletonInstance == null) {  this.targetSource = freshTargetSource();  if (this.autodetectInterfaces getProxiedInterfaces().length == 0 !isProxyTargetClass()) {  // Rely on AOP infrasucture to tell us what interfaces to proxy.  Class targetClass = getTargetClass();  if (targetClass == null) {  throw new FactoryBeanNotInitializedException("Cannot deteine target class for proxy");  // 这里设置代理对象的接口 AllInterfacesForClass(targetClass, this.proxyClassLoader));  // Initiali
ze the shared singleton instance.  per.Proxy);  // 注重这里的办法会用法ProxyFactory来生成我们需要的Proxy  this.singletonInstance = getProxy(createAopProxy());  return this.singletonInstance;  //用法createAopProxy返回的AopProxy来得到代理对象  protected Object getProxy(AopProxy aopProxy) {  Proxy(this.proxyClassLoader);  }上面我们看到了在Spring中通过ProxyFactoryBean实现AOP功能的第一步,得到AopProxy代理对象的基本过程,下面我们看看AopProxy代理对象的拦截机制是怎样发挥作用,是怎样实现AOP功能的。我们知道,对代理对象的生成,有CGLIB和JDK两种生成方式,在CGLIB中,对设计是通过在Cglib2AopProxy的AopProxy代理对象生成的时候,在回调DynamicAdviInterceptor对象中实现的,这个回调的实现在intercept办法中完成。对于AOP是怎样完成对目标对象的增加的,这些实现是封装在AOP链中,由一个个详细的来完成的。详细的运行是在以下的代码实现中完成的,这些调用在ReflectiveMethodInvoion中。  public Object proceed() throws Throwable {  // We start with an ind of -1 and increment early.  //假如链中的迭代调用尽毕,这里开头调用target的函数,这个函数是通过反射机制完成的,详细实现在:AopUtils.invokeJoinpointUsingReflection办法里面。  if (this.currentIntercep
torIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {  return invokeJoinpoint();  //这里沿着定义好的 interceptorOrInterceptionAdvice链举行处理。  Object interceptorOrInterceptionAdvice =  (++this.currentInterceptorIndex);  if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {  // Evaluate dynamic method matcher here: ic part will already have  // been uated and found to match.  //这里对举行动态匹配的的推断,还记得我们前面分析的point吗?这里是触发举行匹配的地方,假如和定义的pointcut匹配,那么这个advice将会得到执行。  InterceptorAndDynamicMethodMatcher dm =  (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice;  if (dm.methodMatcher.hod, this.targetClass, this.arguments)) {  return dm.interceptor.invoke(this);  else {  // Dynamic matching failed.  // Skip this interceptor and invoke the next in the chain.  // //假如不匹配,那么这个proceed会被递归调用,直到全部的都被运行过为止。  return proceed();  else {  // It's an interceptor, so we just invoke it: The pointcut will have  // been evaluated statically before this object was constructed.  //假如是一个interceptor,挺直调用这个intercespring framework是什么框架的
ptor对应的办法  return((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);  }在调用的时候,我们接下去就可以看到对advice的通知的调用。而经过一系列的注册,适配的过程以后,在拦截的时候,会调用到预置好的一个通知适配器,设置通知,这是一系列Spring设计好为通知服务的类的一个,是终于完成通知拦截和实现的地方,十分的关键。比如,对MethodBeforeAdviceInterceptor的实现是这样的: public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable {  private MethodBeforeAdvice advice;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。