动态代理,AOP,CGLib
java的动态代理
动态代理:代理类在程序运行时创建,在内存中临时生成一个代理对象,在运行期间对业务方法进行增强。
JDK实现代理只需要使用newProxyInstance方法:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h )
参数说明:
【1】ClassLoader loader:指定当前目标对象使用的类加载器
【2】Class<?>[] interfaces:目标对象实现的接口的类型
【3】InvocationHandler h:当代理对象调用目标对象的方法时,会触发事件处理器的invoke方法()
以下是JDK动态代理Demo:
public class DynamicProxyDemo { public static void main(String[] args) { //被代理的对象 MySubject realSubject = new RealSubject(); //调用处理器 MyInvacationHandler handler = new MyInvacationHandler(realSubject); MySubject subject = (MySubject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(), handler); System.out.println(subject.getClass().getName()); subject.rent(); } } interface MySubject { public void rent(); } class RealSubject implements MySubject { @Override public void rent() { System.out.println("rent my house"); } } class MyInvacationHandler implements InvocationHandler { private Object subject; public MyInvacationHandler(Object subject) { this.subject = subject; } @Override public Object invoke(Object object, Method method, Object[] args) throws Throwable { System.out.println("before renting house"); //invoke方***拦截代理对象的方法调用 Object o = method.invoke(subject, args); System.out.println("after rentint house"); return o; } }
Spring哪里用到了动态代理?
Spring AOP 是通过动态代理技术实现的。
什么是AOP?
AOP,面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是那些与业务无关,但所有业务模块都会调用的公共逻辑。
动态代理的实现方式?
动态代理技术的实现方式有两种:
1、基于接口的 JDK 动态代理。
2、基于继承的 CGLib 动态代理。在Spring中,如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。
说一下CGlib动态代理
CGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。
CGLib 动态代理相对于 JDK 动态代理局限性就小很多,目标对象不需要实现接口,底层是通过继承目标对象产生代理子对象。
](https://www.nowcoder.com/discuss/741351?type=post&order=time&pos=&page=0&ncTraceId=&channel=-1&source_id=search_post_nctrack&subType=2)