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
	
}

 

 

小结:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值