Spring学习笔记-11-代理模式


代理模式.

SpringAOP的底层

1、静态代理.

角色分析:

  • 抽象角色:一般会使用接口抽象类来解决
  • 真实角色():被代理的角色
  • 代理角色():代理真实角色,做一些附属操作
  • 客户():访问代理角色的人

抽象接口

public interface IRent {
    //租房
    void rent();
}

被代理类

//房东
public class Host implements IRent{
    @Override
    public void rent() {
        System.out.println("房东出租房屋");
    }
}

代理类

//中介
public class HostProxy implements IRent{
    //房东对象
    private Host host;

    public HostProxy(Host host){
        this.host = host;
    }

    @Override
    public void rent() {
        //中介带用户看房子
        seeHouse();
        //房东出租房屋
        host.rent();
        // ...
    }

    private void seeHouse(){
        System.out.println("中介带用户看房子");
    }
}

客户

public class Client {
    public static void main(String[] args) {
        Host h = new Host();
        IRent proxy = new HostProxy(h);

        proxy.rent();
    }
}

代理模式的好处:

  • 可以使真实角色的操作更加纯粹,不用关注一些公共业务
  • 公共业务就交给代理角色,实现了业务的分工
  • 公共业务发生扩展的时候,方便集中管理

缺点:

  • 一个真实角色就会产生一个代理角色;代码量会翻倍,开发效率会变低

2、动态代理.

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的,不是我们写好的
  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
    • 基于接口 JDK动态代理
    • 基于类 cglib
    • java字节码实现 javasist

需要两个类

  • Proxy:代理
  • InvocationHandler:调用处理程序

抽象接口

public interface IRent {
    void rent();
}

被代理类

public class Host implements IRent{
    @Override
    public void rent() {
        System.out.println("房东出租房子");
    }
}

调用处理类:创建代理类

public class HostInvocationHandler implements InvocationHandler {
    private Object target;

    //设置被代理对象
    public void setTarget(Object target) {
        this.target = target;
    }

    //获取代理对象
    public Object getProxy(){
        //被代理对象的类加载器  实现的接口  调用处理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        seeHouse();
        method.invoke(target, args);
        return null;
    }

    //附加的操作
    private void seeHouse(){
        System.out.println("中介带客户看房子");
    }
}

客户

public class Client {
    public static void main(String[] args) {
        IRent host = new Host();
        HostInvocationHandler hih = new HostInvocationHandler();
        //设置被代理对象
        hih.setTarget(host);
        //获得代理对象
        IRent proxy = (IRent)hih.getProxy();
        //代理 执行方法
        proxy.rent();
    }
}

动态代理的好处

  • 可以使真实角色的操作更加纯粹,不用关注一些公共业务
  • 公共业务就交给代理角色,实现了业务的分工
  • 公共业务发生扩展的时候,方便集中管理
  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多个类,只要是实现了同一个接口

https://www.cnblogs.com/cC-Zhou/p/9525638.html

https://www.cnblogs.com/joy99/p/10865391.html


文章作者: liuminkai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuminkai !
评论
 上一篇
Spring学习笔记-10-JavaConfig实现配置 Spring学习笔记-10-JavaConfig实现配置
JavaConfig实现配置.目录结构 JavaConfig,是在 Spring 3.0 开始从一个独立的项目并入到 Spring 中的。JavaConfig 可以看成一个用于完成 Bean 装配的 Spring 配置文件,即 Spri
2020-08-03
下一篇 
Spring学习笔记-9-使用注解开发 Spring学习笔记-9-使用注解开发
使用注解开发.在spring4之后,必选导入aop的包才能使用注解 xml中开启注解 <!-- 指定要扫描的包,这个包下的注解就会生效 --> <context:component-scan base-package="pojo
2020-08-03
  目录