【代理】【一】代理源码解析-导读
1 什么是代理
代理是指给某一个对象提供一个代理对象,代理对象持有原对象的引用。一句话通过代理对象增强原对象的功能,比如在原对象调用一个方法的前后进行日志、事务操作等。Spring AOP就使用了代理模式。
2 代理的分类
代理又分为静态代理和动态代理,所谓静动站在我们自己来说就是静态需要我们自己去写一个一个的代理对象,而动态就是通过某种技术动态批量生成一批对象的代理对象。
- 静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
- 静态代理事先知道要代理的是什么,而动态代理不知道要具体代理哪些对象,只有在运行时才知道。
- 静态代理有可能存在多个代理 引起"类爆炸",因为需要一个个创建代理对象,而动态代理不会。
- 动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。它会根据需要,通过反射机制在程序运行期,动态的为目标对象创建代理对象,无需程序员手动编写它的源代码。
动态代理技术又分为:JDK动态代理和CGLIB。
- JDK动态代理是实现InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。
- CGLIB动态代理,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。通过在运行时,动态修改字节码达到修改类的目的。
3 静态代理入门
我们本节先从静态代理入门,了解一下一个静态代理的基础实现。实现静态代理有四个步骤:
- 定义业务接口UserService;
- 实现业务接口UserServiceImpl;
- 定义代理类并实现业务接口UserServiceProxy;
- 使用代理类完成业务。
/** * @author: xjx * @description */ public interface UserService { public void addUser(); }
public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("我新增了一个用户"); } }
public class UserServiceProxy implements UserService { // 代理类中持有原始对象的引用 private UserService userService; public UserServiceProxy(UserService userService) { this.userService = userService; } @Override public void addUser() { System.out.println("前置操作"); // 调用原始对象 userService.addUser(); System.out.println("后置操作"); } }
public class Client { public static void main(String[] args) { UserService userService = new UserServiceImpl(); UserServiceProxy proxy = new UserServiceProxy(userService); proxy.addUser(); } }
4 小结
代理的相关知识就先介绍到这里,我们也从静态代理尝试体会一下代理的味道,下节我们开始结合源码详细讲解JDK动态代理和CGLIB的实现过程。