上一个例子演示了对特定的bean中的所有的方法进行面向切面编程,包括了 before , after , after throwing, around 几种形式:

如果想对一个bean中的特定方法进行切面编程,而不是所有的方法,就需要设置pointcut了,pointcut允许拦截一个方法通过 方法名 ,一个 pointcut必须和一个advisor想关联。

一般有以下配置组成:

1:advice  在方法执行前(before)后(after)做出相应的响应。通常是定义一些实现接口的类,然后实现相应的方法,比如:before  对应的实现MethodBeforeAdvice接口   ,  after对应的实现AfterReturningAdvice   , around对应的实现MethodInterceptor接口 ,  after throwing 对应的实现:ThrowsAdvice 接口, 实现对应的接口的方法即可。

Pointcut 运用的例子:

一:能够通过以下两种方式匹配相应的方法:
   1:通过name(名称)匹配。
   2:通过正则表达式匹配。
 
二:通过名称匹配:
1:通过pointcut 和 advisor 拦截printName方法:创建一个org.springframework.aop.support.NameMatchMethodPointcut的切点bean  ----->   bookPointcut   即切点(pointcut) 其属性 mappedName  定义了 需要拦截的方法,就是切点。如下:
  1. <!-- define  a  pointcut -->
  2. <bean id="bookPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
  3. <property name="mappedName" value="printName" />
  4. </bean>

2:定义一个advice 相当于 对切点所做的操作, 根据advice的拦截位置需要实现相应的接口,比如: MethodInterceptor 是around对应的接口。

配置片段如下:
  1. <!-- around  method -->
  2. bean id="aroundMethod"  class="com.myapp.core.aop.advice.AroundMethod" />

对应的类:

  1. package com.myapp.core.aop.advice;
  2. import java.util.Arrays;
  3. import org.aopalliance.intercept.MethodInterceptor;
  4. import org.aopalliance.intercept.MethodInvocation;
  5. public class AroundMethod  implements MethodInterceptor{
  6. @Override
  7. public Object invoke(MethodInvocation methodInvocation) throws Throwable {
  8. // TODO Auto-generated method stub
  9. System.out.println("method  name:" + methodInvocation.getMethod().getName());
  10. System.out.println("method  arguments" + Arrays.toString(methodInvocation.getArguments()));
  11. System.out.println("Around  method : before ");
  12. try{
  13. Object result = methodInvocation.proceed();
  14. System.out.println("Around method : after ");
  15. return  result;
  16. }catch(IllegalArgumentException e){
  17. System.out.println("Around method : throw  an  exception ");
  18. throw  e;
  19. }
  20. }
  21. }

以上就是一个advice对应的类:

 
3:定义一个 advisor 
advisor 是org.springframework.aop.support.DefaultPointcutAdvisor的bean里面有对应的属性:
包括:
pointcut  相当于以上定义的:bookPointcut
advice相当于以上定义的:aroundMethod
 
所以advisor对应的配置如下:
  1. <!-- define a advisor -->
  2. <bean id="bookAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
  3. <property name="pointcut"  ref="bookPointcut"/>
  4. <property name="advice" ref="aroundMethod"></property>
  5. </bean>

其他部分不变:

 
完整的配置文件如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  6. <!-- more bean definitions for data access objects go here -->
  7. <bean id="book" class="com.myapp.core.aop.advice.Book">
  8. <property name="name" value="Effective java" />
  9. <property name="url" value="www.google.cn"/>
  10. <property name="pages" value="300" />
  11. </bean>
  12. <!-- around  method -->
  13. <bean id="aroundMethod"  class="com.myapp.core.aop.advice.AroundMethod" />
  14. <!-- define  a  pointcut -->
  15. <bean id="bookPointcut" class="org.springframework.aop.support.NameMatchMethodPointcut">
  16. <property name="mappedName" value="printName" />
  17. </bean>
  18. <!-- define a advisor -->
  19. <bean id="bookAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
  20. <property name="pointcut"  ref="bookPointcut"/>
  21. <property name="advice" ref="aroundMethod"></property>
  22. </bean>
  23. <bean id="bookProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >
  24. <property name="target" ref="book"/>
  25. <property name="interceptorNames">
  26. <list>
  27. <value>bookAdvisor</value>
  28. </list>
  29. </property>
  30. </bean>
  31. </beans>

对应的测试类:

  1. package com.myapp.core.aop.advice;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class MainTest {
  5. public static void main(String[] args) {
  6. ApplicationContext  context  = new  ClassPathXmlApplicationContext("resource/aop.xml");
  7. Book   book  =   (Book) context.getBean("bookProxy");
  8. System.out.println("---------------------");
  9. book.printName();
  10. System.out.println("---------------------");
  11. book.printUrl();
  12. System.out.println("----------------------");
  13. try{
  14. book.printThrowException();
  15. }catch(Exception e){
  16. //  e.printStackTrace();
  17. }
  18. }
  19. }

测试结果:

只有在调用printName方法的时候才应用around的,其他方法不应用around,所以输出结果如下:
  1. 三月 20, 2013 5:37:23 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
  2. INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@eb67e8: startup date [Wed Mar 20 17:37:23 CST 2013]; root of context hierarchy
  3. 三月 20, 2013 5:37:23 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. INFO: Loading XML bean definitions from class path resource [resource/aop.xml]
  5. 三月 20, 2013 5:37:23 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@157985: defining beans [book,aroundMethod,bookPointcut,bookAdvisor,bookProxy]; root of factory hierarchy
  7. ---------------------
  8. method  name:printName
  9. method  arguments[]
  10. Around  method : before
  11. Book name Effective java
  12. Around method : after
  13. ---------------------
  14. Book URL www.google.cn
  15. ----------------------

只有在printName方法上作用了around,其他方法没有调用,over。

Spring 运用 pointcut 和 advisor 对特定的方法进行切面编程的更多相关文章

  1. spring aop pointcut 切入点是类的公共方法(私有方法不行),还是接口的方法

    spring aop pointcut 切入点是类的公共方法(私有方法不行),还是接口的方法 类的公共方法可以,但是私有方法不行 测试一下接口的方法是否能够捕捉到

  2. 不依赖Spring使用AspectJ达到AOP面向切面编程

    网上大多数介绍AspectJ的文章都是和Spring容器混用的,但有时我们想自己写框架就需要抛开Spring造轮子,类似使用原生AspectJ达到面向切面编程.步骤很简单,只需要两步. 1.导入依赖 ...

  3. (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)

    Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1)  IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...

  4. spring aop方式配置事务中的三个概念 pointcut advice advisor

    AOP的3个关键概念 因为AOP的概念难于理解,所以在前面首先对Java动态代理机制进行了一下讲解,从而使读者能够循序渐进地来理解AOP的思想. 学习AOP,关键在于理解AOP的思想,能够使用AOP. ...

  5. Spring学习笔记:使用Pointcut 和Advisor实现AOP

    基础知识 在 Spring AOP 中,有 3 个常用的概念,Advices . Pointcut . Advisor ,解释如下: Advices :表示一个 method 执行前或执行后的动作. ...

  6. Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法

    Spring3系列10- Spring AOP——Pointcut,Advisor 上一篇的Spring AOP Advice例子中,Class(CustomerService)中的全部method都 ...

  7. 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-切入点(pointcut)API

    本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 让我们看看 Spring.N ...

  8. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  9. Spring面向切面编程(AOP)

    1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即 ...

随机推荐

  1. python实现web分页日志查看

    当我们维护一个网站时,无论前台还是后台,经常会出现各种个样的问题.有时候问题很难直观的发现,这个时候只能查看各种日志来跟踪问题.但是查看日志有各种个样的问题.首先,要用各种工具登陆到服务器,这个有时候 ...

  2. [工作记录] Android OpenGL ES 2.0: square texture not supported on some device

    npot texture: non-power-of-two texture.rectangle texture: non-square (height != wdith) 在测试Samsumg Ga ...

  3. HDU1058Humble Numbers

     Humble Numbers Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u     ...

  4. Topcoder srm 632 div2

    脑洞太大,简单东西就是想复杂,活该一直DIV2; A:水,基本判断A[I]<=A[I-1],ANS++; B:不知道别人怎么做的,我的是100*N*N;没办法想的太多了,忘记是连续的数列 我们枚 ...

  5. FM算法

    1.FM背景 在计算广告中,CTR预估(click-through rate)是非常重要的一个环节,因为DSP后面的出价要依赖于CTR预估的结果.在前面的相关博文中,我们已经提到了CTR中相关特征工程 ...

  6. POJ 3253 Fence Repair(优先队列,哈夫曼树,模拟)

    题目 //做哈夫曼树时,可以用优先队列(误?) //这道题教我们优先队列的一个用法:取前n个数(最大的或者最小的) //哈夫曼树 //64位 //超时->优先队列,,,, //这道题的优先队列用 ...

  7. HDU 3998 Sequence (最长上升子序列+最大流)

    参考链接:http://www.cnblogs.com/gentleh/archive/2013/03/30/2989958.html 题意:求一个序列的最长上升子序列,及其个数(注意:两个最长上升子 ...

  8. 单选项框RadioGroup的综合应用

    大家好,我们今天这一节要介绍的是RadioGroup 的组事件.RadioGroup 可将各自不同的RadioButton ,设限于同一个Radio 按钮组,同一个RadioGroup 组里的按钮,只 ...

  9. ***Jquery下Ajax与PHP数据交换

    一.前台传递字符串变量,后台返回字符串变量(非json格式) Javascript代码: 这里,为了解决Ajax数据传递出现的汉字乱码,在字符串传递之前,使用javascript函数escape()对 ...

  10. **apache环境下 禁止显示 index of/ 目录下(如何禁止访问网站根目录)

    比如: http://123.57.49.XX6// 当这样访问的时候,可能会列出网站的根目录 如何禁止列出网站目录,方法如下: 让别人知道你的网站目录结构直接查看你目录下的所有文件是很危险的一个事情 ...