快速业务通道

struts-2.1.8.1+jquery-1.3.2+spring-framework-2.5.6集成 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

Spring源代码解析(五):Spring AOP获取Proxy

时间:2011-03-29 javaeye jiwenke

下面我们来看看Spring的AOP的一些相关代码是怎么得到Proxy的,让我们我们先看看 AOP和Spring AOP的一些基本概念:

Advice:

通知,制定在连接点做什么,在Sping中,他主要描述Spring围绕方法调用注入的额外 的行为,Spring提供的通知类型有:

before advice,AfterReturningAdvice,ThrowAdvice,MethodBeforeAdvice,这些都是 Spring AOP定义的接口类,具体的动作实现需要用户程序来完成。

Pointcut:

切点,其决定一个advice应该应用于哪个连接点,也就是需要插入额外处理的地方的 集合,例如,被某个advice作为目标的一组方法。Spring pointcut通常意味着标示方法 ,可以选择一组方法调用作为pointcut,Spring提供了具体的切点来给用户使用,比如正 则表达式切点 JdkRegexpMethodPointcut通过正则表达式对方法名进行匹配,其通过使用 AbstractJdkRegexpMethodPointcut中的对MethodMatcher接口的实现来完成pointcut功能 :

Java代码

public final boolean matches(Method method, Class targetClass) {      //这里通过放射得到方法的全名      String patt = method.getDeclaringClass().getName() + "." + method.getName();      for (int i = 0; i < this.patterns.length; i++) {        // 这里是判断是否和方法名是否匹配的代码        boolean matched = matches(patt, i);        if (matched) {          for (int j = 0; j < this.excludedPatterns.length; j++) {            boolean excluded = matchesExclusion(patt, j);            if(excluded) {              return false;            }          }          return true;        }      }      return false;    }

在JDKRegexpMethodPointcut中通过JDK中的正则表达式匹配来完成pointcut的最终确 定:

Java代码

protected boolean matches(String pattern, int patternIndex) {      Matcher matcher = this.compiledPatterns[patternIndex].matcher (pattern);      return matcher.matches();    }

Advisor:

Spring源代码解析(五):Spring AOP获取Proxy(2)

时间:2011-03-29 javaeye jiwenke

当我们完成额外的动作设计(advice)和额外动作插入点的设计(pointcut)以后,我们 需要一个对象把他们结合起来,这就是通知器 - advisor,定义应该在哪里应用哪个通知 。Advisor的实现有:DefaultPointcutAdvisor他有两个属性advice和 pointcut来让我们 配置advice和pointcut。

接着我们就可以通过ProxyFactoryBean来配置我们的代理对象和方面行为,在 ProxyFactoryBean中有interceptorNames来配置已经定义好的通知器-advisor,虽然这里 的名字叫做interceptNames,但实际上是供我们配置advisor的地方,具体的代理实现通过 JDK 的Proxy或者CGLIB来完成。因为ProxyFactoryBean是一个FactoryBean,在 ProxyFactoryBean中我们通过getObject()可以直接得到代理对象:

Java代码

public Object getObject() throws BeansException {      //这里初始化通知器链      initializeAdvisorChain();      if (isSingleton()) {      //根据定义需要生成单件的Proxy        return getSingletonInstance();      }      else {      .......        //这里根据定义需要生成Prototype类型的Proxy        return newPrototypeInstance();      }    }

我们看看怎样生成

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号