6.SpringAOP-代理模式-动态代理

发布时间 2023-10-07 16:18:23作者: 哲_心

把上个案例进行修改

  1. 实现动态代理接口:
    public class Agencey implements InvocationHandler{
  2. 编写set货源方法
        private Insurance sellFamily;
        public Agencey(Insurance s) {
            sellFamily = s;
        }
  3. 使用proxy创建代理类
    public Object getobject() {
        //参数:代理类的类加载器, 代理接口, InvocationHandler接口,因为本类实现了,所以为this
        return  Proxy.newProxyInstance((this.getClass().getClassLoader(),sellFamily.getClass().getInterfaces(),this);
    }
  4. 利用接口实现方法, 调用代理方法,  这里就类似于静态代理的  sellFamily.sellinsurance()   

          invoke是被重写的,所以会在调用getobject()方法后,创建了这个代理,
          这个代理里面就包含现在的invoke()方

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //于是乎这里就可以做代理商想做的事情了!如:
    System.out.println("动态代理收了80w的代理费,已经跑路了....");
    //               参数:真实买家,方法名称
    return  method.invoke(sellFamily,args);//调用方法并返回结果
}
  1. 客户使用:

 

 

 

 

最后,万能动态代理工具:

public class DynamicProxy implements InvocationHandler {
    //原主人 接口
    Object master;
    //获取代理商
    public Object getDynamicProxy(Object master){
        //设置原主人
        this.master = master;
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),master.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //.....可以添加代理内容
        Object invoke = method.invoke(master, args);
        return invoke;
    }
}

 调用:

@Test
public void testz(){
    //真实卖家
    Insurances insuranceImpls = new InsuranceImpls();
    //代理商(货源) //初始化代理商,现在卖家就被这个类代理了,就可以走到invoke里了
    Insurances dynamicProxy = (Insurances)new DynamicProxy().getDynamicProxy(insuranceImpls);

    //买到房子
    dynamicProxy.SellInsurance();
}

 

 

 

10/07/2023  3:57:45 PM