6.SpringAOP-代理模式-动态代理
把上个案例进行修改
- 实现动态代理接口:
public class Agencey implements InvocationHandler{
- 编写set货源方法
private Insurance sellFamily; public Agencey(Insurance s) { sellFamily = s; }
- 使用proxy创建代理类
public Object getobject() { //参数:代理类的类加载器, 代理接口, InvocationHandler接口,因为本类实现了,所以为this return Proxy.newProxyInstance((this.getClass().getClassLoader(),sellFamily.getClass().getInterfaces(),this); }
- 利用接口实现方法, 调用代理方法, 这里就类似于静态代理的 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);//调用方法并返回结果
}- 客户使用:

最后,万能动态代理工具:
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

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号