[Spring 03] 静态代理和动态代理

Spring_03 AOP


3. 静态代理

三个角色:


接口:

真实角色 继承 接口

代理角色 继承 接口{组合 真实角色 并包装真实角色的方法}


好处: 1. 真实角色更加纯粹在业务方面;2. 实现了业务的分工;3. 公共业务发生扩展,方便集中管理

缺点:每个真实角色都需要一个代理角色(动态代理的原因),代码维护量翻倍

AOP的机制:

4. 动态代理

1. 分类

动态代理的作用和静态代理的一样

动态代理是在使用过程中动态产生的,不是定义好的

动态代理有两大类: 基于接口的动态代理, 基于类的动态代理

  • 基于接口的动态代理: jdk
  • 基于类的动态代理:jclib
  • JAVA字节码的实现: javassist

2. 实现

宏观思想: 通过传入某种被代理类,灵活获得某种代理类的模式

InvocationHandle 接口: invoke()方法

Proxy类的静态方法: newProxyInstance()方法

实现思想: 给一个继承了InvocationHandle的类传入一个被代理类获得代理类并用invoke方法实现被代理类中方法的类

//测试类:
Host host = new Host();//具体的一个房东(继承Rent接口,实现rent()方法)
ProxyBuilder proxyBuilder = new ProxyBuilder();//创建一个产生Proxy的类
proxyBuilder.setObject();//传入参数设置要产生的Proxy类的类型
Rent proxy = proxyBuilder.getProxy();//返回这个类型的代理
proxy.rent();// 执行proxy代理的方法

思路: 代理谁, 生成代理类,调用代理类的方法

//产生动态代理的类: 
public class ProxyBuilder implements InvocationHandle{
//继承接口,实现invoke方法
    private Object object;
    public void setObject(Object object){//set方法设置object类型
        this.object = object;
    }
    public Object getProxy(){//获取object类型的代理的方法
        return Proxy.newProxyInstance(三个参数);//调用Proxy的静态方法
        //参数为: 被代理类的加载器,被代理类的Class类,handle(这里是this)
    }
    //InvocationHandle接口中的方法,
    //代理类需要做的其他事情的方法可以放在invoke中执行(代理需要做的事情)
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在被代理类的方法调用前 的 代理类自己的方法
        Object invoke = method.invoke(object, args);//传入被代理类,实现被代理类的方法,在调用时使用
        return invoke;//返回值不重要
    }
    //代理类自己的方法
}

继承了一个接口的类,既可以是Object类型,也可以是接口类型

posted @ 2021-12-27 16:38  Roy2048  阅读(44)  评论(0)    收藏  举报