上篇文章说的JDK的动态代理,下面我们来讲讲cglib动态代理的实现。
其实你会发现JDK的动态代理,是对接口的,没有对普通的类,怎么办,CGLIB可以解决的这个事,你会
发现啊,原声的总是太麻烦的,很多框架都是在原声的基础上做一些文章,比如Netty,对nio封装,简化
开发,curator对zookeeper封装,简化api开发,都是简化后然后开发出一些新技能,稍大点的公司,干脆
就最市场上留出的框架自己开发出适合自己公司技术体系的框架。
上代码吧,
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
CGLIB增强主要有这几个类,ENhancer,MethodInterceptor,MethodProxy
public class CglibTest {
//普通类
@Test
public void testCglibProxy() {
final NewsSpider newsSpider = new NewsSpider();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(newsSpider.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
System.out.println(" 在调动方法处理前做。。。。。。。。。 ");
Object object = method.invoke(newsSpider, args);
System.out.println(" 在调动方法处理后做。。。。。。。。。 ");
return object;
}
});
NewsSpider ns = (NewsSpider) enhancer.create();
ns.createNewsSpider("细节--");
}
//接口
@Test
public void testCgligInterfaceProxy() {
final SpiderOrderImpl spiderOrder = new SpiderOrderImpl();
Enhancer en = new Enhancer();
en.setSuperclass(SpiderOrder.class); //设置接口类 cglib增强类
en.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
System.out.println(" 在调动方法处理前做。。。。。。。。。 ");
Object object = method.invoke(spiderOrder, args);
System.out.println(" 在调动方法处理后做。。。。。。。。。 ");
return object;
}
});
SpiderOrder enSpiderOrder = (SpiderOrder) en.create();
enSpiderOrder.crawlingSpider();
}
}
如果有找不到那个相关类,在我的上一篇文章里有写到。
spring的aop两个代理底层基础是这样的,那么我们下片文章会说说spring aop,是怎么回事,有些人只会用spring框架,项目框架
搭建好了,能用,再加上业务多,很多开发人员很少有去真正静下心来,学学一些基础知识。