代理模式

代理模式是SpringAop的底层实现机制
在这里插入图片描述

静态代理

在这里插入图片描述
角色:

  • 抽象角色: 一般由接口或抽象类实现
  • 真实角色:被代理的角色
  • 代理角色: 代理真实角色后,一般会增加一些附加操作
  • 客户:访问代理角色的人

静态代理的优点 :

  • 真实角色可以专注于自己的业务
  • 公共业务交给代理角色,实现业务的分工
  • 代理角色可以扩展业务,并集中管理
  • 可以在不修改原有代码的基础上,添加一些日志的功能

静态代理的缺点 :
每生成一个真实对象,就要生成一个代理对象,代码量会翻倍,开发效率会降低


动态模式

1.基于接口实现
Api:InvocationHandler,Proxy

角色:

  • 抽象角色: 一般由接口或抽象类实现
  • 真实角色:被代理的角色
  • 代理角色: 代理真实角色后,一般会增加一些附加操作
  • 客户:访问代理角色的人

优点:
在静态代理的基础上,解决静态代理的缺点:动态生成代理类

/**
 * 实现InvocationHandler(在反射包下) 1.基于接口实现
 * 通过这个类,自动生成代理类
 */
public class DynamicProxyBulider implements InvocationHandler {

    Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    /**
     * 动态生成代理类
     * @return
     */
    public Object getProxy(){
        /**
         * 通过反射
         * 参数:
         *          类加载器(应用类加载器)
         *          被代理类的接口
         *          InvocationHandler:this,当前类实现了InvocationHandler
         */
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    /**
     * 相当于一个环绕通知,切入点为调用的接口
     *
     * @param proxy   被代理目标
     * @param method    方法
     * @param args      参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /*
        动态代理的本质就是反射
         */
        method.invoke(target,args);
        System.out.println(args[0]);
        System.out.println("后置通知");

        return null;
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值