`
greemranqq
  • 浏览: 972009 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

spring AOP(二) --cglib代理

阅读更多

前面说了一下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
	
}

 

 

小结:

      这个可以代理接口和类,原理可以参考那个源码地址,效率估计要低点了!

       这个其实都是老生常谈了,这个只是简单记录一下,嘿嘿,为后面的框架设计做准备~。~。

2
0
分享到:
评论
2 楼 greemranqq 2015-06-15  
harim 写道
好文章!!

纯基础,有兴趣可以去看看 cglib 的东西 和 asm  的东西,都是那里面的
1 楼 harim 2015-06-13  
好文章!!

相关推荐

Global site tag (gtag.js) - Google Analytics