在开始Spring的AOP分析之前,先来看一个很老的一个问题。。。假设你在开发的过程中,需要在类A中的方法之前执行一些逻辑(我们称为逻辑A),你可能的一个做法是直接修改类A中的方法,在类A中的方法的开始处写上要添加的代码,你还可能会给类A生成一个代理类,去对调用方法进行拦截,在代理类里面去执行相应的逻辑(逻辑A)。直接修改类A中的方法一般是我们不推荐的方式(存在改动量大、不易扩展等问题),我们通常采用的做法是为类A生成一个代理对象,在执行的时候去执行我们的代理对象。小例子如下(这里使用的JDK动态代理的方式):
/**
* @author zkn
* @date 2018/3/18
*/
public interface ProxyService {
/**
* 测试方法
*/
void testProxy();
}
/**
* @author zkn
* @date 2018/3/18
*/
public class ProxyServiceImpl implements ProxyService {
/**
* 测试方法
*/
@Override
public void testProxy() {
System.out.println("我是ProxyService中的测试方法......");
}
}
/**
* @author zkn
* @date 2018/3/18
*/
public class LogicClassFir {
/**
* 逻辑方法A
*/
public void logicMethodFir() {
System.out.println("我是第一个逻辑方法的内容........");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author zkn
* @date 2018/3/18
*/
public class ProxyCreator implements InvocationHandler {
private Object proxy;
private LogicClassFir logicObj;
public ProxyCreator(Object proxy, LogicClassFir logicObj) {
this.proxy = proxy;
this.logicObj = logicObj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
logicObj.logicMethodFir();
return method.invoke(this.proxy, args);
}
}
public class ProxyTest {
public static void main(String[] args) {
LogicClassFir logicClassFir = new LogicClassFir();
ProxyService targetService = new ProxyServiceImpl();
ProxyService proxyService = (ProxyService) Proxy.newProxyInstance(ProxyCreator.class.getClassLoader(),
new Class[]{ProxyService.class}, new ProxyCreator(targetService, logicClassFir));
proxyService.testProxy();
}
}
复制代码
输出结果如下: