上一个例子演示了对特定的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. JavaScript垃圾回收

    JavaScript内存监测工具   http://www.cnblogs.com/strick/p/4002010.html

  2. Asp.net与Flex交互测试记录

    一.利用asp.net为Flex提供数据服务,flex为前端表现. 二.flex通过三种方式四种代码实现来取数据.分别为     HttpService. WebService. RemoteObje ...

  3. hbase表结构设计

    非常好的一个ppt   HBase Schema design: http://www.slideshare.net/cloudera/5-h-base-schemahbasecon2012

  4. 如何在帝国cms后台菜单栏中添加删除链接?

    下午测试一个网上下载经过二次开发的帝国cms系统,还原完数据进入后台ytkah发现菜单栏多出了几个链接,有点不习惯,就想着怎么把它去掉.由于自己用的win7系统,搜索时没有像xp那样可以搜索包含某字符 ...

  5. 驱动笔记 - ioctl

    #include <linux/ioctl.h> 定义命令 _IO(type,nr) 没有参数的命令 _IOR(type,nr,datatype) 从驱动中读数据 _IOW(type,nr ...

  6. java 以及 vs 的快捷键

    javactrl+shift+y 小写ctrl+shift+x 大写ctrl+shift+f 格式化代码 vsctrl+u 小写ctrl+shift+u 大写ctrl+k+f 格式化代码

  7. struts.properties的参数描述

    A.2.1 概述 如果我们希望覆盖在default.properties文件里面定义的默认配置,那就可以定义struts.properties文件,在里面设置我们需要的值,当然现在也可以在struts ...

  8. 2014多校第一场 E 题 || HDU 4865 Peter's Hobby (DP)

    题目链接 题意 : 给你两个表格,第一个表格是三种天气下出现四种湿度的可能性.第二个表格是,昨天出现的三种天气下,今天出现三种天气的可能性.然后给你这几天的湿度,告诉你第一天出现三种天气的可能性,让你 ...

  9. shell脚本替换文件中字符

    1.将当前目录下包含jack串的文件中,jack字符串替换为tom sed -i "s/jack/tom/g" `grep "jack" -rl ./` 2.将 ...

  10. Jmeter 快速入门教程(三-2) -- 设置集结点

    集合点:简单来理解一下,虽然我们的“性能测试”理解为“多用户并发测试”,但真正的并发是不存在的,为了更真实的实现并发这感念,我们可以在需要压力的地方设置集合点, 还拿那个用户和密码的地方,每到输入用户 ...