这个东西其实是第三方的,理论要导jar包 ,但是呢 ,Spring 在后面直接集成了他 ,你可以在源码找到。
我们现在用这玩意来写动态代理:
先导入 Spring的gav
第一步 直接新建一个 增强类:【你爱弄不弄...】
package com.bihu.cglib;
public class EnhanceMethod {
public void before(){
System.out.println("前置增强...");
}
public void after(){
System.out.println("后置增强...");
}
}
第二步 新建一个目标类
package com.bihu.cglib;
import com.bihu.TargetInterface;
public class Target implements TargetInterface {
@Override
public void method() {
System.out.println("method Running·····");
}
}
第三步 直接新建一个测试类【里面写创建代理对象的方法】
package com.bihu.cglib;
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 AgentTest {
public static void main(final String[] args) {
final Target target = new Target();
final EnhanceMethod enhanceMethod = new EnhanceMethod();
// 1 .创建增强器
final Enhancer enhancer = new Enhancer();
// 2 .设置父类(目标)
enhancer.setSuperclass(Target.class);
// 3 .设置回调[这里其实你可以实现这个接口 然后传个this进去]
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] object, MethodProxy methodProxy) throws Throwable {
//增强前置
enhanceMethod.before();
//执行方法
Object invoke = method.invoke(target, object);
//增强后置
enhanceMethod.after();
return invoke;
}
});
// 4 .创建代理对象[为什么用Target 我们说过了 它类似于复制 嘿嘿...]
Target proxy = (Target) enhancer.create();
//5.直接调用即可
proxy.method();
}
}
其实这个比较容易
当然写法你可以去降低耦合 就是实现接口 MethodInterceptor 来直接写,然后呢创建代理对象直接用传参的方法【即 把 测试类封装】。
其实仔细看一点都不难 主要是那些东西是这样的就是这样的。。。。
作者:咸瑜