1、Spring AOPMade by Michael.S全文以超市售货这个例子来演示 SpringAOP 的实现。其中包括:POJO(Customer, Squishee) ,接口 WallsMart(其中有方法 Squishee buySquishee(Customer customer),接口实现WallsMart_Xian,Advice(包括 Before, afterReturning)AOP-API 实现Advice 介绍Before Advice需要实现MethodBeforeAdvice接口public interface MethodBeforeAdvice void befor
2、e(Method method, Object args, Object target)throws ThrowableMethod 是目标方法,args 是参数,target 是方法调用的目标对象其中,args 和 target 对象是不能够改变的。实现:public class WelcomeAdvice implements MethodBeforeAdviceOverridepublic void before(Method method, Object args, Object target)Customer customer = (Customer)args0;System.out
3、.println(“Hello, “ + customer.getName() + “! Welcome .“);在 xml 中配置com.primeton.spl.WallsMartadvice(1).配置被代理对象 bean: wallsMartTarget(2).配置 Advise bean: welcomeAdvice(3).配置代理类 bean: wallsMart其中:属性 proxyInterfaces 是指代理的接口属性 interceptorNames 是指要拦截的方法名字(在类 Advice 中可以包括before,afterReturning 等方法,这样都会进行拦截)属
4、性 target 是指被代理对象wallsMart 这个 bean 的功能即:(1).实现 wallsMart 这个接口(2).应用 welcomeAdvice 这个对象到所有的调用中(3).将 WallsMart_Xian 设定为目标对象Comment Mike1: 需要引入aopalliance.jarAfterAdvice需要实现AfterReturningAdvice接口public interface AfterReturningAdvice void afterReturning(Object returnValue, Method method,Object args, Obje
5、ct target) throws ThrowableOverridepublic void afterReturning(Object arg0, Method arg1, Object arg2,Object arg3) throws ThrowableSystem.out.println(“This is After advice . “);其中参数 returnValue是指目标方法的返回值AroundAdvice需要实现MethodInterceptor接口public interface MethodInterceptor extends Interceptor Object in
6、voke(MethodInvocation invocation) throws Throwable;注意:(1). MethodInterceptor控制着目标方法是否被调用(通过调用MethodInvocation.proceed());(2). MethodInterceptor给你设定返回值的权力。你可以返回你想要的返回值(类型必须相同),通过调用 proceed()方法。class AroundAdvice implements MethodInterceptorOverridepublic Object invoke(MethodInvocation arg0) throws Th
7、rowableSystem.out.println(“Before“);Object obj = arg0.proceed();System.out.println(“After“);return obj;ThrowAdvice这是一个Marker 接口,没有任何方法需要被实现, Advice类实现该接口只需要至少实现下列两个方法之一即可:void afterThrowing(Throwable throwable)void afterThrowing(Method method, Object args, Object target,Throwable throwable)参数throwab
8、le就是指所抛出异常。你也可以在一个Advice类中含有多个afterThrowing方法用来区分对待不同的异常信息。class ExceptionAdvice implements ThrowsAdvicepublic void afterThrowing(NullPointerException eNull)System.out.println(“Null Pointer .“);public void afterThrowing(RuntimeException eRT)System.out.println(“Run Time .“);注意:上述两个方法不能够捕获和处理异常,异常信息会继
9、续传播下去。PointCutPointcut根据方法和类判断哪里需要织入。public interface Pointcut ClassFilter getClassFilter();MethodMatcher getMethodMatcher();其中:public interface ClassFilter boolean matches(Class clazz);public interface MethodMatcher boolean matches(Method m, Class targetClass);public boolean isRuntime();public bool
10、ean matches(Method m, Class target, Object args);推荐使用静态 PointcutAdvisor是pointcut 和 advice的结合。public interface PointcutAdvisor Pointcut getPointcut();Advice getAdvice();(1). NameMatchMethodPointcutAdvisor类中有两个方法:public void setMappedName(String)public void setMappedNames(String)根据方法名字进行拦截Beans.xml 文件
11、配置:.配置 advice 的 bean,包含 before,afterReturning 等 advice 方法:.配置 advisororder*可以使用通配符*来进行匹配.配置 ProxyFactoryBeancom.primeton.spl.cleaning.MaidServicefrequentCustomerPointcutAdvisor与上文中提到的 Before 不同的地方在于:Before:Advisor:这样会降低耦合,而且会更加灵活。(2). RegexpMethodPointutAdvisor正则表达式实现方法Xml 文件配置只需要将上述 advisor 改变即可:.*
12、get.*AOP-Annotation 实现1. 启动 aop 支持(1).普通 xml 格式(2).DTD 格式2. 声明 AspectAspectpublic class FrequentCustomerAdvice在 Advice 类上面声明该类为 aspect 类3. 声明 pointcut,设置 before,after 等方法Before(“execution( * com.primeton.spl.cleaning.MaidService.*(.)“)public void before()System.out.println(“Before Advice . “);注意:Aro
13、und 方法 需要有一个参数来使得方法运行Around(“execution( * com.primeton.spl.cleaning.MaidService.*(.)“)public void around(ProceedingJoinPoint pjp) throws ThrowableSystem.out.println(“Before method“);pjp.proceed();System.out.println(“End method“);AOP-XML 实现1. 配置 Aspect2. 配置 pointcut3. 配置 before,after注意:这时的 before 可以不用像 API 实现方法那样继承那些接口;如果 before等方法有参数,则需要在 execution 表达式中进行设置。public void before()System.out.println(“Before Advice . “);全局 pointcut