Spring aop的理论知识

代理设计模式: 是java中常用的设计模式!
   
  例子:
  小明找 小黑 给 小红送一朵玫瑰花!
   
  小明: 委托类
  小黑: 代理类
  小红也得知道 花是小明送的!
  但是在小黑送花之前和之后对小红做什么?那就不知道!
   
   
  主业务: 送花
  系统级业务: 小黑送花之前和之后的行为
   
   
  小黑说:"这是小明送你的玫瑰花!";
  小红说:"滚"!
  小黑就愉快的飞走了!
  然后小黑把 小红说的话 转达给小明!
   
  特点:
  01.委托类和代理类有相同的接口或者共同的父类!
  02.代理类为委托类负责处理消息,并将消息转发给委托类!
  03.委托类和代理类对象通常存在关联关系!
  一个代理类对象与一个委托类对象关联!
  04.代理类本身并不是真正的实现者!而是通过调用委托类的方法,
  来实现功能!
   
   
  按照代理类创建的时机,代理类分为两种:
  01.静态代理:由我们程序猿或者特定的工具自动生成了源代码,
  在程序运行之前,.class文件已经存在了!
  (serviceImpl 调用了 dao层的方法! 真正的实现是Dao)
  02.动态代理:在程序运行期间,通过反射的方式动态的创建出来!
   
   
  按照我们的使用方式: 是由共同的接口还是公共的父类?
   
  01.jdk动态代理 (接口)
  必须知道一个类和一个接口
  001.InvocationHandler接口只有一个方法
   
  public Object invoke(Object proxy, Method method, Object[] args)
  throws Throwable;
   
  proxy:代理类对象
  method:被代理的方法
  args:被代理的方法的参数列表
   
  002.Proxy 类:
  public static Object newProxyInstance(ClassLoader loader,
  Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException
  loader:类加载器
  interfaces:代理类实现的所有接口
  h:InvocationHandler接口的一个实例 this当前对象
  因为我们想使用jdk动态代理 必须是 代理类 实现 InvocationHandler!
  它让我们传递父接口 我们传递 自身!
   
  02.cglib动态代理(接口+父类)
  必须知道一个类和一个接口
  001.MethodInterceptor接口
   
  public Object intercept(Object obj,
  Method method,Object[] args,MethodProxy proxy) throws Throwable;
   
  intercept是所有拦截器执行的方法,类似于jdk动态代理中的invoke
   
   
  002. Enhancer类
   
  设置委托类和代理类的公共接口或者公共的父类
  public void setSuperclass(Class superclass) {
  if (superclass != null && superclass.isInterface()) {
  setInterfaces(new Class[]{ superclass });
  } else if (superclass != null && superclass.equals(Object.class)) {
  // affects choice of ClassLoader
  this.superclass = null;
  } else {
  this.superclass = superclass;
  }
  }
   
  代理类执行完毕 通知委托类
  public void setCallback(final Callback callback) {
  setCallbacks(new Callback[]{ callback });
  }
   
   
  在Enhancer类的父类AbstractClassGenerator中有一个方法
  创建我们需要的代理类
  protected Object create(Object key)
posted @ 2017-10-09 13:44  Interface代码  阅读(132)  评论(0)    收藏  举报