原理
- 不管是静态代理还是jdk动态代理,代理的条件之一就是要求目标类和代理类实现同一业务接口;所以,对于无接口类的代理,我们就不能再用之前的代理方式;
- CGLIB动态代理的生成原理是 生成目标类的子类,而子类是增强过的,即子类就是目标类的代理类 。所以,使用CGLIB动态代理,要求目标类必须能够被继承,即不能是final的类
实现
- 导入CDLIB的jar包:cglib-full.jar  
- 定义目标类,不用实现任何接口 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- public class AccountService { 
 //目标方法
 public void transfer(){
 System.out.println("转账!");
 }
 }
- 创建代理类的工厂,该类需实现MethodInterceptor接口 - 声明目标类的成员变量,并创建接受该参数的构造器
- 定义代理生成方法,用于创建代理对象,即目标类的子类
- 定义回调接口方法,在这里对目标类进行增强
 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40- public class AccountServiceCglibProxyFactory implements MethodInterceptor { 
 //1. 声明目标类的成员变量,并创建接受该参数的构造器
 private AccountService targer;
 public AccountServiceCglibProxyFactory(AccountService targer) {
 this.targer = targer;
 }
 public AccountServiceCglibProxyFactory() {
 }
 //2. 定义代理生成方法,用于创建代理对象,即目标类的子类
 public AccountService createProxy(){
 //创建增强器
 Enhancer enhancer = new Enhancer();
 //初始化增强器,将目标类指定为父类
 enhancer.setSuperclass(AccountService.class);
 //初始化增强器,设置回调方法,因为MethodInterceptor接口继承自Callback,因此可以使用this
 enhancer.setCallback(this);
 //使用增强器创建代理对象
 return (AccountService) enhancer.create();
 }
 //3. 定义回调接口方法,在这里对目标类进行增强;
 //本类中调用了Enhance类的setCallback(this)方法,并将回调对象this作为实参传递给了Enhancer类;
 //Enhancer类在后续的执行过程中,会调用本类的intercept方法;
 //这个intercept()方法就是回调方法
 
 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
 //若为transfer方法,则进行增强
 if("transfer".equals(method.getName())){
 //直接调用目标对象的业务方法执行
 Object result = method.invoke(targer, objects);
 return result;
 }
 return method.invoke(targer, objects);
 }
 }
- 定义客户类 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- public class Client { 
 public static void main(String[] args) {
 //创建目标对象
 AccountService target = new AccountService();
 //创建代理对象
 AccountService proxy = new AccountServiceCglibProxyFactory(target).createProxy();
 //执行增强后的业务方法
 proxy.transfer();
 }
 }
