初识Mybatis拦截器——使用动态代理模式实现业务功能的扩展


package test2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author dubl @date:2019年12月12日
 */

//声明一个接口
interface Executor{
	void execute(String statement);
}
//接口的实现类(将来的目标对象)
class DefaultExecutor implements Executor{
	@Override
	public void execute(String statement) {
		System.out.println("execute"+statement);
	}
}
//当代理对象执行目标方法时,需要具体的Handler去执行。
class TargetProxyHandler implements InvocationHandler{
	private Object target;
	public TargetProxyHandler(Object target) {
		this.target = target;
	}
	
	@Override
	//在invoke方法实现业务的扩展
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("execute start"+System.nanoTime());
		Object result = method.invoke(target, args);//目标对象执行的方法
		System.out.println("execute end"+System.nanoTime());
		return result;
	}
}
//生成代理对象的工厂
class TargetProxyFactory{
	public static Object newProxy(Object target) {
		return Proxy.newProxyInstance(
				target.getClass().getClassLoader(),//和目标对象使用同一个类加载器
				target.getClass().getInterfaces(),//和目标对象实现同一个接口
				new TargetProxyHandler(target));//生成代理对象执行
	}
}
public class Test1 {
	public static void main(String[] args) {
		Executor target = new DefaultExecutor();//生成目标对象
		Executor proxy = (Executor)TargetProxyFactory.newProxy(target);//生成代理对象
		proxy.execute("statement");//代理对象调用
	}
}

执行结果,在目标方法执行业务的时候,动态代理实现了功能的扩展。

你可能感兴趣的:(Mybatis,实现业务功能)