Spring学习笔记_AOP的cglib动态代理底层实现方式
程序员文章站
2022-07-12 14:30:02
...
单独使用cglib是需要到jar的。
当在spring中使用时cglib的部分随着spring-context.jar的导入已经引用了。
Target目标对象
package com.cvicse.ump.proxy.jdk.impl;
import com.cvicse.ump.proxy.jdk.TargetInterface;
/**
* 目标对象
*/
public class Target implements TargetInterface {
/**
* 目标方法
*/
public void save() {
System.out.println("runing.......");
}
}
Advice增强对象
package com.cvicse.ump.advice;
/**
* 增强对象
*/
public class Advice {
public void before(){
System.out.println("前置增强.....");
}
public void after(){
System.out.println("后置增强.....");
}
}
模拟AOP底层的cglib动态代理
package com.cvicse.test;
import com.cvicse.ump.advice.Advice;
import com.cvicse.ump.cglib.impl.Target;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class cglibProxyTest {
public static void main(String[] args) {
//创建目标对象
final Target target=new Target();
//创建增强对象
final Advice advice = new Advice();
//生成动态代理对象
//1.创建增强器
Enhancer enhancer=new Enhancer();
//2.设置父类(目标)
enhancer.setSuperclass(Target.class);
//3.设置回调(这里需要一个callback的接口对象,一般用它的如下实现类)
//methodProxy是方法的代理对象,暂时不用管
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//执行前置
advice.before();
//执行目标
Object invoke = method.invoke(target, args);
//执行后置
advice.after();
return invoke;
}
});
//4.创建代理对象
Target proxy = (Target) enhancer.create();
//调用代理方法
proxy.save();
}
}
这里的写法是耦合死了的,这是因为我们只是模拟,使用AOP的时候代理对象的生成代码是AOP根据配置文件等信息动态生成的。
上一篇: 动态代理(基于接口)的方式实现线程绑定和事务控制(非aop)
下一篇: BTabar组件封装(二)