aop详解(二)

来源:互联网 发布:库里生涯数据统计 编辑:程序博客网 时间:2024/05/17 22:43

上篇讲了aop的原理以及使用jdk代理实现aop.

但是使用Jdk代理有局限性,就是必须要有借口,代理是绑定在接口的,所以就产生了cglib动态代理机制实现。

1)添加一个类

public class ClientBean { private String name = null;        public ClientBean()      {        }        public ClientBean(String name)      {          this.name = name;      }        public void addClient()      {          System.out.println("this is addClient() method!");      }        public void deleteClient()      {          System.out.println("this is deleteClient() method!");      }        public void getClient()      {          System.out.println("this is getClient() method!");      }        public void updateClient()      {          System.out.println("this is updateClient() method!");      }        public String getClientName()      {          return name;      }        public void setClientName(String name)      {          this.name = name;      }  }
2)代理类

public class CGLibProxy implements MethodInterceptor{private Object targetObject;      //是针对类来实现代理的,它的原理是根据目标类生成它的一个子类,并覆盖其中的方法实现增强,但因为是继承,所以无法代理final修饰的类    public Object createProxyObject(Object targetObject)      {          this.targetObject = targetObject;          Enhancer enhancer = new Enhancer(); //申明增强类的实例         enhancer.setSuperclass(this.targetObject.getClass());  //设置被代理类的字节码,cglib根据被代理类的字节码生成子类        enhancer.setCallback(this);  //设置回调函数,即一个方法拦截      //通过create方法返回类的代理        return enhancer.create();      }        //methodProxy jdk的java.lang.reflect.method的Method的类的代理类,方便实现被代理类的方法的调用    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable      {          ClientBean clientBean = (ClientBean)targetObject;          String userName = clientBean.getClientName();          Object result = null;                    if(userName != null && !"".equals(userName))          {              result = method.invoke(targetObject, args);          }          System.err.println("After...");        return result;      }  }

3)测试类

public class ProxyExe {public static void main(String[] args)      {          /*   System.out.println(".............CGLIB Proxy....................");          System.out.println("Proved...................."); */         CGLibProxy cproxy = new CGLibProxy();          ClientBean clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean("Bob Liang"));  首先生成代理类        clientBean.addClient();  调用方法时,触发Invoke方法                    }  }




0 0
原创粉丝点击