前面说了一下spring 代理,说的是JDK 的代理,这种代理方式只能通过接口代理,cglib 可以通过类代理,下面是代码:
// 承接上面的,假设我们要为上学这个业务,添加额外的功能,这里直接实用类
// 目标类
public class ServiceImpl implements Service{
public void goSchool(){
System.out.println("去上学");
}
}
// 额外的一些方法
public class ServiceFactory {
public static void before(){
System.out.println("吃早餐");
}
public static void after(){
System.out.println("给爷爷奶奶打声招呼");
}
}
// 动态代理工厂
public class CglibProxyFactory implements MethodInterceptor{
// 目标对象
private Object target;
/**
* 这里和JDK 绑定目标类 类似
* 仅仅是创建了一个以继承了目标类的新对象
* @param target
* @return
*/
public Object bind(Object target){
this.target = target;
// 这里说明一下如果用的cglib-2.2.0 就可以直接就能使用,如果用的其他版本,可 // 能需要asm的jar
// org/objectweb/asm/Type错误 包括spring 的也是由于这两个jar 引起的
Enhancer enhancer = new Enhancer();
// 给Enhancer 属性赋值,内部会判断目标类的类型,目标类不要搞成final了,不然 // 无法实现
enhancer.setSuperclass(this.target.getClass());
// 当前对象CglibProxyFactory,必须要实现一个接口
enhancer.setCallback(this);
// 这里是通过字节码进行 创建实例,参考AbstractClassGenerator里面的create 方 // 法
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method method, Object[] arg2,
MethodProxy proxy) throws Throwable {
ServiceFactory.before();
// 这里用的 MethodProxy
Object obj = proxy.invokeSuper(arg0, arg2);
ServiceFactory.after();
return obj;
}
}
public class Test {
public static void main(String[] args) {
// 这里无论是使用接口 还是 实现类都可以接收
// 这里我创建了接口 和实现类,都可以实现
Service service = (Service) new CglibProxyFactory().bind(new ServiceImpl());
service.goSchool();
// 这里顺便说说 spring aop 默认是jdk 的动态代理
// 要强制使用cglib的 ,设置 proxy-target-class="true"
// 使用aop 一般在事务控制,和 业务层控制两个地方
}
//参考:ciglib 源码 http://blog.csdn.net/liulin_good/article/details/6411201
}
小结:
这个可以代理接口和类,原理可以参考那个源码地址,效率估计要低点了!
这个其实都是老生常谈了,这个只是简单记录一下,嘿嘿,为后面的框架设计做准备~。~。