Spring框架学习笔记-创建增强类

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值