cglib实现动态代理(二)

JDK实现动态代理需要代理类实现接口,这导致在使用中有很大的局限性,毕竟不是所有类都需要实现接口。而cglib通过继承的方式动态产生代理类,cglib是动态代理框架,功能很强大。

改造上节中的日志代理:

/**
 * cglib的处理器
 *
 */
public class LogProxyCglib implements MethodInterceptor  {
	private Object target;  
    public Object newProxyInstance(Object target) {  
        this.target = target;  
        //增强类
        Enhancer enhancer = new Enhancer(); 
        //代理类父类,通过继承的方式
        enhancer.setSuperclass(this.target.getClass());  
  //多个拦截器  NoOp.INSTANCE 是 CGlib 所提供的实际是一个没有任何操作的拦截器,他们是有序的
        enhancer.setCallbacks(new Callback[]{this,NoOp.INSTANCE});  
        //添加过滤器,最执行的方法进行过滤
        enhancer.setCallbackFilter(new LogProxyFilter());
        // 创建代理对象  
        return enhancer.create();  
    }  
  

	//扩展模块
	private void before(String name){
		System.out.println(name+"方法执行开始!");
	}
	//扩展模块
	private void after(String name){
		System.out.println(name+"方法执行结束!");
	}

	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		before(method.getName());
		proxy.invokeSuper(obj, args);  
		after(method.getName());
		return null;

	}
}

/**
 * 日志代理过滤器:查询方法不需要记录日志
 *
 */
public class LogProxyFilter implements CallbackFilter{
	public int accept(Method method) {
//返回值是拦截器的索引。如果是query则使用第二个拦截器,即不进行处理
  if("query".equalsIgnoreCase(method.getName()))     
	            return 1;     
	     return 0;  
	}

}
	public static void main(String[] args) {
		
		//Service service = (Service)(new LogProxyHandler()).newProxyInstance(new UserServiceImpl());
		Service service=(Service)(new LogProxyCglib()).newProxyInstance(new UserServiceImpl());
		service.add();
		service.query();
	}

运行结果:只对add()进行前后处理


spring-aop就使用cglib进行动态代理。使用继承有继承的局限比如final修饰的方法不能执行。

参考:http://blog.csdn.net/qq_25689397/article/details/51427164

http://www.cnblogs.com/cruze/p/3865180.html#lable3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值