代理模式
定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的访问。
代理模式的目的
- 防止直接访问目标对象带来的复杂性
- 增强原有的业务逻辑
动态代理是不改变源码的基础上,对类中的某个方法进行增强,字节码随用随创建,随用随加载。
静态代理是字节码一上来就创建好,并且加载完成,装饰者模式就是静态代理的一种体现。
静态代理
从一段代码说起
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