首页 > 代码库 > 创建增强类
创建增强类
Spring支持5种类型的增强:
1).前置增强
org.springframework.aop.BeforeAdvice代表前置增强.spring目前只支持方法级的增强, 所以MethodBeforeAdvice是目前可用可用的前置增强, 表示在目标方法执行前执行增强.
2).后置增强
org.springframework.aop.AfterReturningAdvice代表后置增强, 表示在目标方法返回后实施增强逻辑
3).环绕增强
org.aopalliance.intercept.MethodInterceptor表示环绕增强, 在方法执行前后执行增强.
4).异常抛出增强
org.springframework.aop.ThrowsAdvice表示异常抛出增强, 在方法抛出异常后实施增强.
5).引介增强
org.springframework.aop.IntroductionInterceptor表示引介增强, 可以在目标类中增加一些新的方法和属性.
这些增强接口都有一些方法, 通过实现这些接口方法, 这方法中定义横切逻辑,就可以将他们织入到目标类方法的相应连接点的位置.
1.前置增强
下面通过规范服务员的礼貌用于来演示前置增强.
服务员:
package com.bao.bao.aop;
/**
* Created by xinfengyao on 16-7-4.
*/
public interface Waiter {
void greetTo(String name);
void serveTo(String name);
}
一个训练不足的服务员:
package com.bao.bao.aop;
/**
* Created by xinfengyao on 16-7-4.
*/
public class NaiveWaiter implements Waiter {
@Override
public void greetTo(String name) {
System.out.println("greet to " + name + "...");
}
@Override
public void serveTo(String name) {
System.out.println("serving " + name + "...");
}
}
NaiveWaiter服务员只是简单地走到客人面前提供服务, 没有任何礼貌用语. 下面通过前置增强, 来规范服务员的服务行为.
增强逻辑:
package com.bao.bao.aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
/**
* Created by xinfengyao on 16-7-4.
*/
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object o) throws Throwable {
String clientName = (String) args[0];
System.out.println("How are you! Mr." + clientName + ".");
}
}
BeforeAdvice是前置增强的接口, MethodBeforeAdvice是其子类, MethodBeforeAdvice只定义了一个方法:
public void before(Method method, Object[] args, Object obj) throws Throwable
method为目标类的方法, args为方法的入参, obj为目标类实例.
礼貌用语的前置增强定义好后, 下面我们将强制规范服务生的礼貌用语
package com.bao.bao.aop;
import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;/**
* Created by xinfengyao on 16-7-4.
*/
public class TestBeforeAdvice {
public static void main(String[] args) throws Exception {
Waiter target = new NaiveWaiter();
BeforeAdvice advice = new GreetingBeforeAdvice();
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(target);
proxyFactory.addAdvice(advice);
Waiter proxy = (Waiter) proxyFactory.getProxy();
proxy.greetTo("John");
proxy.serveTo("Tom");
}
}
运行结果:
How are you! Mr.John.
greet to John...
How are you! Mr.Tom.
serving Tom...
正如我们所看到的一样, 礼貌用语得到的实施.
ProxyFactory就是通过JDK代理和CGLIB代理, 将增强织入到目标类中.
spring定义了org.springframework.aop.framework.AopProxy接口,并提供了两个final类型实现类
创建增强类