Spring使用增强类定义横切逻辑,同时由于Spring只支持方法连接点,增强还包括了在方法的哪一点加入横切代码的方位信息,所以增强既包括横切逻辑,还包括部分连接点的信息。
1.增强类型
前置增强: org.springframework.aop.MethodBeforeAdvice,代表前增强,表示在目标方法执行前实施增强。
后置增强: org.springframework.aop.AfterReturningAdvice,代表后增强,表示在目标方法执行后实施增强。
环绕增强: org.aopalliance.intercept.MethodInterceptor,代表环绕增强,表示在目标方法执行前后实施增强。
异常抛出增强: org.springframework.aop.ThrowsAdvice,代表异常抛出增强,表示在目标方法抛出异常时实施增强。
引介增强: org.springframework.aop.IntroductionInterceptor,代表引介增强,表示在目标类中添加一些新的方法和属性。
这些增强接口都有一些方法,通过实现这些接口方法,在接口方法中定义横切逻辑,就可以将它们织入到目标类方法的相应连接点的位置。
2.前置增强
热情待客、礼貌服务已经成为服务行业的基本经营理念,下面,我们通过前置增强对服务生的服务用语进行强制规范。
首先,我们定义服务生的接口,假设服务省只干两件事:第一,欢迎顾客。第二,对顾客提供服务。
public interface Waiter{
void greetTo(String name);
void serveTo(String name);
}
现在,我们来看一个训练不足的服务生的服务情况。
public class NaiveWaiter implements Waiter{
public void greeTo(String name){
System.out.println("greet to"+name+"...");
}
public void serveTo(String name) {
System.out.println("serving to"+name+"...");
}
}
NaiveWaiter只是简单地向顾客打招呼,闷不做声地直接提供服务。现在,我们对NaiveWaiter的服务进行规范,让他们在打招呼和提供服务之前,都必须先对顾客使用礼貌用语。
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class GreetingBeforeAdvice implements MethodBeforeAdvice{
public void before(Method method,Object[] args,Object obj)throws Throwable{
String clientName=(String)args[0];
System.out.println("How are you!Mr."+clientName+".");
}
}
礼貌用于的前置增强指定好之后,下面,我们着手强制在服务生队伍中应用这个规则。
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;
public class TestBeforeAdvice{
public static void main(String[] args){
Waiter target=new NaiveWaiter();
MethodBeforeAdvice advice=new GreetingBeforeAdvice();
ProxyFactory pf=new ProxyFactory();
pf.setTarget(target);
pf.addAdvice(advice);
Waiter proxy=(Waiter)pf.getProxy();
proxy.greetTo("John");
proxy.serveTo("Tom");
}
}
运行上面的代码,我们将看到如下的输出信息:
How are you!Mr.John.
greet to John...
How are you!Mr.Tom.
serving to Tom...
3.后置增强
后置增强在目标类方法调用之后执行,假设服务生在每次服务之后,也需要使用规范的礼貌用语,我们可以通过一个后置增强来实施这一要求。
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class GreetingAfterAdvice implements AfterReturningAdvice{
public void afterReturning(Object arg0, Method arg1, Object[] arg2,Object arg3) throws Throwable {
System.out.println("Please enjoy yourself!");
}
}
同理,礼貌用于的后置增强指定好之后,我们着手强制在服务生队伍中应用这个规则。
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.framework.ProxyFactory;
public class TestAfterAdvice{
public static void main(String[] args){
Waiter target=new NaiveWaiter();
AfterReturningAdvice advice=new GreetingAfterAdvice();
ProxyFactory pf=new ProxyFactory();
pf.setTarget(target);
pf.addAdvice(advice);
Waiter proxy=(Waiter)pf.getProxy();
proxy.greetTo("John");
proxy.serveTo("Tom");
}
}
运行上面的代码,我们将看到如下的输出信息:
greet to John...
Please enjoy yourself!
serving to Tom...
Please enjoy yourself!
4.环绕增强
介绍完前置、后置增强,环绕增强的作用就非常好理解了,环绕增强允许在目标类方法调用前后织入横切逻辑,它综合实现了前置、后置增强两者的功能。下面,我们使用环绕增强同时实现前礼貌用语和后礼貌用语。
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class GreetingInterceptor implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) throws Throwable {
//截获目标类方法的执行,并在前后添加横切逻辑
//MethodInvocation不但封装目标方法及其入参数组,还封装了目标方法所在的实例对象
Object[] args=invocation.getArguments();//通过调用getArguments()可以获取目标方法的入参数组
String clientName=(String)args[0];
System.out.println("How are you!Mr."+clientName+".");
Object obj=invocation.proceed();//通过proceed()反射调用目标实例相应的方法
System.out.println("Please enjoy yourself!");
return obj;
}
}
同理,礼貌用于的环绕增强指定好之后,我们着手强制在服务生队伍中应用这个规则。
import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.framework.ProxyFactory;
public class TestInterceptor{
public static void main(String[] args){
Waiter target=new NaiveWaiter();
MethodInterceptor advice=new GreetingInterceptor();
ProxyFactory pf=new ProxyFactory();
pf.setTarget(target);
pf.addAdvice(advice);
Waiter proxy=(Waiter)pf.getProxy();
proxy.greetTo("John");
proxy.serveTo("Tom");
}
}
5.异常抛出增强
这个我们暂时放下,等到DAO部分学习完毕再一起学习。
6.引介增强
详见博文
https://blog.csdn.net/qwe6112071/article/details/50962613