《我不懂设计模式》什么tmd叫动态代理?

1、常用应用场景
Spring AOP,
Struts2 拦截器。
日志框架
事务
权限等

2、实现方式
基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxyInstance动态构建全新的代理类(继承Proxy类,并持有InvocationHandler接口引用 )字节码文件并实例化对象返回。(jdk动态代理是由java内部的反射机制来实例化代理对象,并代理的调用委托类方法)
基于CGlib 动态代理模式 基于继承被代理类生成代理子类,不用实现接口。只需要被代理类是非final 类即可。(cglib动态代理底层是借助asm字节码技术)

3、实战(如下 给print 方法前后增加打印出时间或者打印日志,但是不能直接在print方法里增加(开闭原则)。)

public interface HelloInterface {
     
    void  print();
}
public class Hello implements HelloInterface{
     
    @Override
    public void  print() {
     
        System.out.println("Hello!");
    }
}

(1)继承方式实现

 public class  Printerextends  extends Printer {
     
    public void print(){
     
         System.out.println("" );
        System.out.println("Hello!");
        System.out.println("");
    }
}

(2)静态代理方式实现

public class HelloProxy implements HelloInterface{
     
    private HelloInterface helloInterface = new Hello();
    @Override
    public void print() {
     
        System.out.println("" );
        helloInterface.print();
        System.out.println("");
    }
}

4、需求升级(相关类下所有函数都需要增加打印日志)
用继承方式和静态代理可以实现,但是要增加好多雷同的类。有没有好的办法?

引出动态代理 如下:( JDK 、反射)
代理类:

public class ProxyHandler implements InvocationHandler{
     
    private Object object;
    public ProxyHandler(Object object){
     
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     
        System.out.println("Before invoke "  + method.getName());
        method.invoke(object, args);
        System.out.println("After invoke " + method.getName());
        return null;
    }
}

使用:

  public static void main(String[] args) {
     
        
        HelloInterface hello = new Hello();    
        InvocationHandler handler = new ProxyHandler(hello);
        HelloInterface proxyHello = (HelloInterface)Proxy.newProxyInstance(hello.getClass().getClassLoader(),hello.getClass().getInterfaces(), handler);

        proxyHello.Hello();
    }

实现原理:上源码:

你可能感兴趣的:(《数据结构与算法》,java,设计模式,proxy,spring,动态代理)