cglib实现动态代理(二)

来源:互联网 发布:最新英雄联盟比赛数据 编辑:程序博客网 时间:2024/06/01 20:40

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