下面以JdkRegexpMethodPointcut为例,通过一个完整的范例展示如何使用静态切入点(完整工程代码见例程4.3)。在工程中我们定义一个People类和一个切面,并将他们在Spring xml配置文件中联系起来。当People对象执行我们切入点中定义的方法时,前置装备LogerPeople将会给出相应的提示信息。
新建一个工程AOP_Test4.3,添加Spring开发库后,新建aop.test包。
创建目标类People,该类有speak、Running、Loving、died四个成员方法。代码如下:
代码
/****/package aop.test;/*** @author zhangyong**/public class People{ // 讲话 public void speak() { System.out.println("Hello,我是People!"); } // 跑步 public void Running() { System.out.println("我在跑……跑…………逃……"); } // 恋爱 public void Loving() { System.out.println("我在和MM恋爱……别来打搅我!"); } // 死亡 public void died() { System.out.println("完了,我死了"); }}
创建一个类名为LogerPeople的前置装备,它实现MethodBeforeAdvice接口,在before方法中利用Log4J输出相关信息,代码如下:
代码
/****/ package aop.test;import java.lang.reflect.Method;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFacTory;import org.springframework.aop.MethodBeforeAdvice;/*** @author zhangyong **/ public class LogerPeople implements MethodBeforeAdvice { private static final Log log = LogFacTory.getLog(LogerPeople.class); public void before(Method method, Object[] args, Object target) throws Throwable { // 这里什么也不做,只是利用Log4J输出日志信息 log.info(target.getClass().getSimpleName() + "正在" + method.getName()+ "!"); } } /****/package aop.test;import java.lang.reflect.Method;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFacTory;import org.springframework.aop.MethodBeforeAdvice;/*** @author zhangyong**/public class LogerPeople implements MethodBeforeAdvice { private static final Log log = LogFacTory.getLog(LogerPeople.class); public void before(Method method, Object[] args, Object target) throws Throwable { // 这里什么也不做,只是利用Log4J输出日志信息 log.info(target.getClass().getSimpleName() + "正在" +method.getName()+ "!"); }}
再编写Spring配置文件,完成后如下:
代码
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> class="org.springframework.aop.framework.ProxyFacToryBean"> DefaultAdvisor class="org.springframework.aop.support.DefaultPointcutAdvisor"> class="org.springframework.aop.support.JdkRegexpMethodPointcut"> .*spea.* .*ing .*di.*
为了让ProxyFacToryBean使用我们定义的JdkRegexpMethodPointcut而不是默认的Pointcut,我们需要配置一个切入点配置器PointcutAdvisor,其advice属性指定装备,Pointcut属性指定切入点。然后再将该切入点配置器注入给ProxyFacToryBean。各个Bean的依赖关系和说明如下:
图4.4 ProxyFacToryBean代理生成
在JdkRegexpMethodPointcut中,我们使用了它两个属性patterns和excludedPattern:patterns利用正则表达式指定了我们要监视的方法这里是包含了所有的方法;excludedPattern指定了我们要排除的方法,这里指定了以Run开头的方法。
注意:
1)“.*spea.*”表示所有名字以spea开头的方法,例程中是指speak方法;
2)“.*ing”表示所有名字以ing结束的方法,例程中是指Running和Loving方法;
3)“.*di.*”表示所有名字以di开头的方法,例程中是指died方法;
4)“.*Run.*”表示所有名字以Run开头的方法,例程中是指Running方法;
创建含主方法的测试类TestMain,在一种我们从ProxyFacToryBean中获得People实例对象,并一次调用该对象的方法,代码如下:
代码 /****/ package aop.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author zhangyong **/ public class TestMain { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext( "applicationContext.xml"); //通过ProxyFacToryBean获取IComputer接口实现类的实例 People c = (People) ac.getBean("ProxyFacToryBean"); c.speak(); c.Running(); c.Loving(); c.died(); } }
该类运行结果如下:
图4.5 例程4.3运行结果
可以看到People类中的speak、Loving、died方法已经被拦截。但是Running方法却没有拦截,这是因为我们在JdkRegexpMethodPointcut中指定其excludedPattern属性把它排除在切入点之外的缘故。
本文地址:http://www.blogjava.net/cmzy/archive/2008/08/10/220917.html)
青春在我的心中是苦涩的又是甘甜的,是精致的又是粗糙的,