spring-CGLib动态代理

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 }

 

posted @ 2017-10-18 21:16  友情天  阅读(1537)  评论(0编辑  收藏  举报