0
点赞
收藏
分享

微信扫一扫

CGLIB动态代理


Spring的传统AOP 中根据类是否实现了接口,来采用不同的代理方式

1.如果实现类接口,使用JDK动态代理完成AOP

2.如果没有实现接口,采用CGLIB动态代理完成AOP

上面已经说了JDK的动态代理是 根据 实现同一个接口来 生成 代理对象了(这里也存在多态,执行目标方法 是调用具体实现了的方法)

而CGLIB动态代理则是,生成目标类的 子类 作为代理对象



package com.mo;

import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
* CGLIB动态代理
* -->当一个类没有实现接口的时候,springaop就使用CGLIB动态代理,
* 原理是生成它的子类对象
* @author 文龙
* @version 2018-3-7 下午1:57:12
*/
public class Demo {

public static void main(String[] args) {
UserDaoImpl userDaoImpl = new UserDaoImpl();
UserDaoImpl proxy = getProxy(userDaoImpl);
proxy.save();
}

public static UserDaoImpl getProxy(UserDaoImpl userDaoImpl) {
//创建CGLIB核心的类
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(userDaoImpl.getClass());
//设置回调函数
enhancer.setCallback(new MethodInterceptor() {
//代理对象调用一次方法,就会调用一次 intercept() 方法
public Object intercept(Object obj, Method method, Object[] param,MethodProxy methodProxy) throws Throwable {
System.out.println("进入代理对象");
//正常执行目标方法
methodProxy.invokeSuper(obj, param);
System.out.println("执行目标方法结束");
return null;
}
});
//生成代理对象
UserDaoImpl u = (UserDaoImpl)enhancer.create();
return u;
}
}

//没有实现接口
class UserDaoImpl {
void save(){
System.out.println("save");
}
void update(){
System.out.println("update");
}
}



举报

相关推荐

0 条评论