博客
关于我
Spring 静态代理与 动态代理 【在理解为学习AOP奠定基础】(七)
阅读量:233 次
发布时间:2019-03-01

本文共 2009 字,大约阅读时间需要 6 分钟。

Spring AOP 代理模式学习

代理模式

代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

静态代理

出租房屋

public interface Rent {     void Renthouse();}

房东类

public class Host implements Rent {    @Override    public void Renthouse() {        System.out.println("房东有一套房子出租!!!");    }}

代理类

public class Proxy implements Rent {    private Host host;        public Proxy(Host host) {        this.host = host;    }        @Override    public void Renthouse() {        host.Renthouse();        Money();        seeHose();        hetong();    }        public void Money() {        System.out.println("中介-收取一定的报酬会");    }        public void seeHose() {        System.out.println("中介-带我看房子。");    }        public void hetong() {        System.out.println("满意的话,签合同!");    }}

测试类

public class client {    public static void main(String[] args) {        Host host = new Host();        Proxy proxy = new Proxy(host);        proxy.Renthouse();    }}

动态代理

动态代理分为三大类:基于接口(JDK动态代理)、基于类(CGLIB动态代理)、Java字节码实现(Javassist)。

动态代理实现案例

public interface Rent {    void Rent();}
public class Host implements Rent {    @Override    public void Rent() {        System.out.println("房东有一整套房子出租!!!");    }}
public class ProxyInvocationHandler 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        );    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        return method.invoke(rent, args);    }}
public class client {    public static void main(String[] args) {        Host host = new Host();        ProxyInvocationHandler pih = new ProxyInvocationHandler();        pih.setRent(host);        Rent proxy = (Rent) pih.getProxy();        proxy.Rent();    }}

动态代理的好处

  • 可以使真实角色的操作更加纯粹,不去关注一些公共的业务。
  • 公共部分交给代理角色,便于集中管理。
  • 公共部分发生扩展的部分也更容易实现。
  • 一个动态代理类可以代理多个类,只要实现了一个接口即可。
  • 通过以上内容,可以看出动态代理在实际应用中的重要性和优势。

    转载地址:http://venv.baihongyu.com/

    你可能感兴趣的文章
    python+pytest接口自动化 —— 参数关联
    查看>>
    python+pytest接口自动化 —— 参数关联
    查看>>
    Python+pytest接口自动化 —— 接口测试基础
    查看>>
    python+pytest接口自动化 —— 自动化用例编写思路 (使用pytest编写一个测试脚本)
    查看>>
    Python+pytest接口自动化之cookie绕过登录(保持登录状态)
    查看>>
    python+pytest接口自动化:接口测试
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    Python+requests+unittest执行接口自动化测试详情
    查看>>
    python+requests+unittest执行自动化接口测试!
    查看>>
    Python+Requests编码识别Bug
    查看>>
    python函数编写_[零基础学python]传说中的函数编写条规
    查看>>
    Python+selenium —— UI自动化之鼠标操作
    查看>>
    python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
    查看>>
    Python+Selenium+Threading进行兼容性测试
    查看>>
    Python+selenium+unittest的GUI自动化框架实现
    查看>>
    python函数拟合不规则曲线_Python计算&绘图——曲线拟合问题(转)
    查看>>
    python函数定义的基本格式_零基础学python-2.19 定义函数、调用函数与默认参数
    查看>>
    Python+Selenium之数据驱动测试的实现
    查看>>
    python函数定义与使用+返回值简解
    查看>>
    Python+Selenium登录
    查看>>