Spring自学日志05(代理模式)

为什么要学习代理模式?因为这就是SpringAOP的底层!
抽象角色:一般是接口或抽象类
真实角色:被代理的角色
代理角色:代理真实角色,代理后还会做一些附属操作
客户:访问代理角色的人

静态代理模式的好处

可以是真实角色的操作更加纯粹!不用去关注一下公共的业务
公共业务就交给代理角色,实现的业务的分工。
公共业务拓展是,方便集中管理!

静态代理缺点

一个真实角色就会产生一个代理角色,代码量会翻倍

动态代理

动态代理和静态代理角色一样
动态代理是动态生成的,不是我们直接写好的!
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
1.基于接口—JDk动态代理
2.基于类—cglib
3.java字节码实现:javasist
需要两个类:Proxy,invocationHandler

动态代理模式的好处

可以是真实角色的操作更加纯粹!不用去关注一下公共的业务
公共业务就交给代理角色,实现的业务的分工。
公共业务拓展是,方便集中管理!
动态代理的是一个接口,一般就是应对的一类业务
一个动态代理可以代理多个类,只要实现的同一个接口

动态代理缺点

环境搭建
Rent

package demo;
//租房
public interface Rent {
    public void rent();
}

Host

package demo;
//房东
public class Host implements Rent{

    @Override
    public void rent() {
        System.out.println("房东要出租房子!");
    }
}

ProxyInvovationHandler

package demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//用这个类生成自动代理类
public class ProxyInvovationHandler implements InvocationHandler {

    //被代理的接口
    private Rent rent;
    public void setRent(Rent rent) {
        this.rent = rent;
    }
    //生成代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
    }
    //处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理本质是反射
        Object result = method.invoke(rent,args);
        return result;
    }
}

Client

package demo;
//客户
public class Client {
    public static void main(String[] args){
        //真实角色
        Host host=new Host();
        //代理角色
        ProxyInvovationHandler pih = new ProxyInvovationHandler();
        //通过调用程序处理角色来来处理我们调用的接口对象!
        pih.setRent(host);
        Rent rent=(Rent)pih.getProxy();
        rent.rent();
    }
}
发布了20 篇原创文章 · 获赞 0 · 访问量 202

猜你喜欢

转载自blog.csdn.net/qq_43697752/article/details/103595042