Ⅰ JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解
在Spring框架中,AOP的两种代理方式是动态代理和CGLIB代理。以下是这两种代理方式的详解:
动态代理: 实现机制:动态代理在程序运行时创建代理对象,基于Java的反射机制生成一个实现了特定接口的新类。 代理逻辑:新类包含代理逻辑,如日志记录、安全检查、事务管理等,通过反射调用目标对象的方法。 创建方式:通常通过实现InvocationHandler接口来创建自定义的调用处理器,并通过Proxy类的newProxyInstance方法来创建代理类实例。 优势:代理类与目标类完全解耦,易于维护和扩展。适用于目标对象实现了接口的场景。
CGLIB代理: 实现机制:CGLIB是一个用于代码生成的类库,允许在运行时动态生成子类。 代理逻辑:通过修改字节码实现代理逻辑,无需修改目标类。可以对没有实现接口的类提供AOP支持。 创建方式:生成的代理类通过继承目标类来实现AOP逻辑,从而对原有类的方法进行增强。 优势:更加灵活,适用于目标对象未实现接口的场景。但涉及字节码操作,可能对类加载器造成一定影响。
选择代理方式的主要考虑因素: 动态代理适用于已实现接口的类。 CGLIB代理适用于未实现接口的类,提供更灵活的AOP支持。 Spring通常会自动在动态代理和CGLIB之间进行转换,以适应不同的使用情况。