Spring的AOP简介
1.4 AOP的动态代理技术
常用的动态代理技术:
- JDK代理:基于接口的动态代理技术
- cglib代理:基于父类的动态代理技术
1.5 JDK的动态代理
(1)创建目标接口TargetInterface
package proxy.jdk;
public interface TargetInterface {
void save();
}
(2) 创建目标并实现TargetInterface接口,它是具体被增强的类
package proxy.jdk;
public class Target implements TargetInterface{
@Override
public void save() {
System.out.println("save running......");
}
}
(3)创建增强类
package proxy.jdk;
public class Advice {
/**
* 前置增强
*/
public void before(){
System.out.println("使用jdk动态代理前置增强。。。。");
}
/**
* 后置增强
*/
public void afterReturning(){
System.out.println("使用jdk动态代理后置增强");
}
}
(4)创建代理测试类ProxyTest类
package proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
//创建目标对象
final Target target = new Target();
//获得增强对象
final Advice advice = new Advice();
//返回值 就是动态生成的代理对象
TargetInterface proxyTarget = (TargetInterface) Proxy.newProxyInstance(
target.getClass().getClassLoader(), //目标对象类加载器
target.getClass().getInterfaces(),//目标对象相同的接口字节码对象数组
new InvocationHandler() {
//调用代理对象的任何方法 实质执行的都是invoke方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice.before();//前置增强
Object invoke = method.invoke(target, args);
advice.afterReturning();//后置增强
return invoke;
}
}
);
proxyTarget.save();
}
}
控制台结果:
1.6 cglib动态代理
(1)创建目标类Target(此时不需要接口),需要被增强的类
package proxy.cglib;
public class Target {
public void save() {
System.out.println("save running......");
}
}
(2)创建增强类
package proxy.cglib;
public class Advice {
/**
* 前置增强
*/
public void before(){
System.out.println("使用cglib动态代理前置增强。。。。");
}
/**
* 后置增强
*/
public void afterReturning(){
System.out.println("使用cglib动态代理后置增强");
}
}
(3)创建代理测试类ProxyTest (需要导入cglib的jar包,在spring-core jar内以及包含有了,所以只需要导入spring-core包)
package proxy.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import proxy.jdk.TargetInterface;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(final String[] args) {
//创建目标对象
final Target target = new Target();
//获得增强对象
final Advice advice = new Advice();
//返回值 就是动态生成的代理对象 基于cglib
//1.创建增强器
Enhancer enhancer = new Enhancer();
//2.设置父类(目标)
enhancer.setSuperclass(Target.class);
//3.设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
advice.before(); //执行前置增强
Object invoke = method.invoke(target, args); //执行目标
advice.afterReturning(); //执行后置增强
return invoke;
}
});
//4.创建代理对象
Target proxyTarget = (Target) enhancer.create();
proxyTarget.save();
}
}
控制台测试结果: