1.JDK代理:基于接口的动态代理技术 目标对象必须有接口,目标对象有什么方法,目标接口就有什么方法, 运行期间基于接口动态生成代理对象,所以代理对象也就有目标对象同样的方
1.JDK代理:基于接口的动态代理技术
目标对象必须有接口,目标对象有什么方法,目标接口就有什么方法,
运行期间基于接口动态生成代理对象,所以代理对象也就有目标对象同样的方法。
注意:以下代码只是底层jdk动态代理实现的方式,我们在开发过程中只需要在配置文件中进行配置即可,这些代码spring会帮你自动生成(这是模拟底层)
(1)创建接口及其实现类
public interface TargetInterface {public void save();
}public class Target implements TargetInterface{
@Override
public void save() {
System.out.println("save running....");
}
}
(2)创建增强的方法
public class Advice {public void before(){
System.out.println("前置增强");
}
public void after(){
System.out.println("后置增强");
}
}
(3)测试实现
public class ProxyTest {public static void main(String[] args) {
//目标对象
final Target target=new Target();
//增强对象
final Advice advice=new Advice();
TargetInterface proxy= (TargetInterface) Proxy.newProxyInstance(
//目标对象类加载器
target.getClass().getClassLoader(),
//目标对象相同的接口字节码对象数组
target.getClass().getInterfaces(),
//调用代理对象的任何方法,实质执行的都是invoke方法
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice.before();//前置增强
//执行目标方法
Object invoke = method.invoke(target, args);
advice.after(); //后置增强
return invoke;
}
}
);
//调用代理方法
proxy.save();
}
}
2.cglib代理:基于父类的动态代理技术
基于目标对象动态生成一个代理对象,类似于继承(但不是继承),代理对象内部调用目标对象,在调用目标对象之前或者之后介入一些其他代码,从而完成的增强。
(1)创建目标对象类
public void save() {
System.out.println("save running....");
}
}
(2)创建增强类
public class Advice {public void before(){
System.out.println("前置增强");
}
public void after(){
System.out.println("后置增强");
}
}
3.底层实现
public class ProxyTest {public static void main(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, objects);
advice.after(); //执行后置
return invoke;
}
});
//4.生成代理对象
Target proxy= (Target) enhancer.create();
proxy.save();
}
}
结果:
前置增强
save running…
后置增强