JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
1 package com.yztc.aop.bean; 2 3 public class AccountDaoImpl2 { 4 //代理对象 5 public void add (String name){ 6 System.out.println("add:==="+name); 7 } 8 }
1 package com.yztc.aop.bean; 2 3 import org.springframework.cglib.proxy.Enhancer; 4 import org.springframework.cglib.proxy.MethodInterceptor; 5 import org.springframework.cglib.proxy.MethodProxy; 6 7 import java.lang.reflect.Method; 8 9 public class CglibProxy implements MethodInterceptor { 10 private Enhancer enhancer =new Enhancer(); 11 public Object getProxy(Class clazz){ 12 //设置需要创建子类的类 13 enhancer.setSuperclass(clazz); 14 enhancer.setCallback(this); 15 //通过字节码技术动态创建子类实例 16 return enhancer.create(); 17 } 18 //实现MethodInterceptor接口方法 19 @Override 20 public Object intercept(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable { 21 System.out.println("前置代理"); 22 //通过代理类调用父类中的方法 23 Object result = proxy.invokeSuper(o, args); 24 System.out.println("后置代理"); 25 return result; 26 } 27 }
1 package com.yztc.aop; 2 3 import com.yztc.aop.bean.AccountDaoImpl2; 4 import com.yztc.aop.bean.CglibProxy; 5 6 public class TestMain { 7 public static void main(String[] args) { 8 CglibProxy proxy = new CglibProxy(); 9 //通过生成子类的方式创建代理类 10 AccountDaoImpl2 proxy1 = (AccountDaoImpl2) proxy.getProxy(AccountDaoImpl2.class); 11 proxy1.add("BINDU"); 12 13 } 14 }