校园二手交易网站建设方案,局域网小网站网站建设软件,营销策划模板,吴忠市建设工程质量监督站网站推荐先看JDK 动态代理#xff08;Spring AOP 的原理#xff09;#xff08;面试重点#xff09;
JDK 动态代理与 CGLIB 动态代理的区别 JDK 动态代理有⼀个最致命的问题是其只能代理实现了接⼝的类. 有些场景下,我们的业务代码是直接实现的,并没有接⼝定义.为了解决这个问…推荐先看JDK 动态代理Spring AOP 的原理面试重点
JDK 动态代理与 CGLIB 动态代理的区别 JDK 动态代理有⼀个最致命的问题是其只能代理实现了接⼝的类. 有些场景下,我们的业务代码是直接实现的,并没有接⼝定义.为了解决这个问题,我们可以⽤CGLIB 动态代理机制来解决. CGLIB(Code Generation Library)是⼀个基于ASM的字节码⽣成库它允许我们在运⾏时对字节码进⾏ 修改和动态⽣成. CGLIB 通过继承⽅式实现代理, 很多知名的开源框架都使⽤到了CGLIB.例如 Spring 中的 AOP 模块中: 如果⽬标对象实现了接⼝则默认采⽤ JDK 动态代理, 否则采⽤ CGLIB 动态代理.
CGLIB 动态代理类实现步骤
1.添加依赖 和 JDK 动态代理不同, CGLIB(Code Generation Library) 实际是属于⼀个开源项⽬如果你要使⽤它的话需要⼿动添加相关依赖
dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version
/dependency
2. 定义⼀个类(被代理类 - 目标类)
目标类实现的接口
//声明房东目标对象要执行的相关操作
public interface HouseSubject {void rentHouse(); //出租房子void saleHouse(); //卖房子
}
目标类
public class Landlord implements HouseSubject{Overridepublic void rentHouse() {System.out.println(房东出租房子);}Overridepublic void saleHouse() {System.out.println(房东卖房子);}
}3. ⾃定义 MethodInterceptor 并重写 intercept ⽅法 intercept ⽤于增强⽬标⽅法和 JDK 动态代理中的 invoke ⽅法类似写代理对象的逻辑
// CGLIB 动态代理的逻辑
public class CGLIBDynamicProxy implements MethodInterceptor {private Object target;public CGLIBDynamicProxy(Object target){this.targettarget;}Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//动态代理的逻辑System.out.println(代理接手工作开始);//执行目标对象中的操作Object resultmethodProxy.invoke(target,objects);System.out.println(代理离手工作结束);return result;}
}
4. 通过 Enhancer 类的 create() 创建并使用代理类
//创建代理对象并使用
public class DynamicMain {public static void main(String[] args) {HouseSubject targetnew Landlord();Landlord target1new Landlord();//通过 CGLIB 创建代理对象HouseSubject proxy1 (HouseSubject) Enhancer.create(target.getClass(),new CGLIBDynamicProxy(target));Landlord proxy2(Landlord) Enhancer.create(target1.getClass(),new CGLIBDynamicProxy(target1));//使用代理对象proxy1.saleHouse();proxy1.rentHouse();proxy2.saleHouse();proxy2.rentHouse();}
}
得到的结果如下 成功进行了代理操作