AOP简单实现(面向切面编程)

AOP的基础为代理机制。核心代码完成后,我们想给代码增加一些附加功能,比如日志,拦截等,这时不应该去修改核心代码,而是通过获取代理,在核心代码以外增加代码,实现相关功能。同样在我们没有源代码或无法触碰源代码时,也是如此,即面向切面编程AOP。核心功能与附加功能分开,互不干扰,称之为解耦,使开发过程更加方便。

首先要有一个类,能同时生成cglib代理和jdk代理,用户可以给出Class<?>类或Object对象,直接得到代理,并使用,和得到本身的对象没有区别。
然后我们可以增加附加功能(此处定为拦截)。用户可以提前添加拦截器,在运行时拦截,可以在各个时候(运行前,运行后,出现异常时)拦截,可以多重拦截,用户也可能不想写拦截,那我们就应该写一个简单的默认拦截器,让其使用。
关系图:
在这里插入图片描述

1.拦截

拦截可以分为前置拦截,后置拦截,以及异常时拦截。需要确定的信息有:要拦截哪个类中的哪个方法(Class<?>和method),这是无论哪种拦截都需要的。
前置拦截:在方法运行前就进行拦截,如验证身份信息等,用于判断该方法到底应不应该执行。我们需要一些参数(args,不一定是几个),当身份验证时,要根据传来的身份信息参数来确定。然后我们需要返回是否可以运行方法的信息。
后置拦截:在方法运行完后进行拦截,可以修改运行结果。所以需要一个参数,即运行的结果,而返回的是修改后的结果。
异常拦截:出现异常时,对异常进行处理,无需返回值。

/**
 * 此为intercepter 拦截器 
 * 其中包括拦截的klass类  method方法两个成员
 * 还有三个抽象方法:
 * 前置拦截器  后置拦截器 处理异常拦截器,负责各个时候要做的拦截工作
 * */
public abstract class Intercepter {
	private Class<?> klass;
	private Method method;
	
	... 此处省略若干行不重要的代码
	
	/**前置拦截器 运行之前就进行拦截
	 * @param <args> 参数
	 * @return 拦截后方法是否运行
	 * */
	public abstract boolean beforeIntercept(Object[] args);
	
	/**后置拦截器 运行后对结果进行拦截
	 * @param <result> 运行好的结果  将结果给它,进行对结果的拦截
	 * @return 将拦截处理后的结果返回
	 * */
	public abstract Object afterIntercept(Object result);
	
	/**处理异常拦截器 对出现的异常进行处理
	 * @param <Throwable> 异常  将异常给它 进行对异常的处理 拦截
	 * @return <void> 无返回值
	 * */
	public abstract void exceptionIntercept(Throwable e);

这是一个抽象方法,我们需要再做一个Adapter适配器,以方便以后使用,此时要注意:这部分拦截器作为默认拦截器(这个拦截应当简单,适于各种情况,且不影响程序运行),用户以后若自己写拦截器则可以选择性覆盖默认拦截器,也可以直接使用默认拦截器。

public class InterceptAdapter extends Intercepter {
	... 此处省略若干行不重要的代码
	@Override
	public boolean beforeIntercept(Object[] args) { return true; }
	
	@Override
	public Object afterIntercept(Object result) { return re
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值