Java的三种代理模式(Spring动态代理实现原理)

代理模式

定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的访问。
代理模式的目的

  • 防止直接访问目标对象带来的复杂性
  • 增强原有的业务逻辑
    在这里插入图片描述
    动态代理是不改变源码的基础上,对类中的某个方法进行增强,字节码随用随创建,随用随加载。
    静态代理是字节码一上来就创建好,并且加载完成,装饰者模式就是静态代理的一种体现。

静态代理

从一段代码说起

public interface IUserDao {

    void save();
}
public class UserDao implements IUserDao{

    @Override
    public void save() {
        System.out.println("UserDao保存数据");
    }
}
public class UserProxy implements IUserDao{

    private IUserDao target;

    public UserProxy(IUserDao target) {
        this.target = target;
    }

    @Override
    public void save() {
        System.out.println("UserProxy执行前-----");
        target.save();
        System.out.println("UserProxy执行后-----");
    }
}
public class Test {

    public static void main(String[] args) {

        UserDao userDao=new UserDao();
        UserProxy userProxy=new UserProxy(userDao);
        userProxy.save();
    }
}
  • 代理对象和目标对象要实现一样的接口,一旦增加方法,目标对象和代理对象都需要维护
  • 代理对象需要引用目标对象,换种目标对象,就需要维护多个代理对象

如何解决以上缺点呢?通过动态代理方式

动态代理

JDK动态代理

JDK动态代理是面向接口的动态代理。如果你的类实现了某个接口,Spring AOP会使用JDK动态代理,生成一个和你实现同样接口的一个代理类,构造一个实例对象出来。

Cglib动态代理

Cglib动态代理是通过子类实现的动态代理,如果我们的类没有实现接口,SpringAOP会改用cglib来实现动态代理,他是原类的一个子类,可以动态生成字节码,覆盖、增强原来方法。

https://blog.csdn.net/u013073869/article/details/105271345

https://www.cnblogs.com/qlqwjy/p/7550609.html
https://blog.csdn.net/dhfzhishi/article/details/79692433
https://www.jianshu.com/p/67bf0bea8157
https://zhuanlan.zhihu.com/p/24908105

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值