Spring的代理模式(静态代理和动态代理)

    xiaoxiao2021-03-26  31

    静态代理示例:

    接口:

    [java] view plain copy print ? package com.yourcompany.spring1;    public interface IHello {      public void say(String name);  }  

    实现:

    [java] view plain copy print ? package com.yourcompany.spring1;    public class HelloImpl implements IHello{      public void say(String name){          System.out.println("Hello,"+name);      }  }  

    静态代理:

    [java] view plain copy print ? package com.yourcompany.spring1;    import org.apache.log4j.Level;  import org.apache.log4j.Logger;    public class HelloProxy implements IHello {      private Logger logger=Logger.getLogger(this.getClass().getName());      private IHello hello;            public HelloProxy(IHello hello){          this.hello=hello;      }      public void say(String name) {          //日志服务          log("hello method starts....");          //执行业务逻辑          hello.say(name);                  //日志服务          log("hello method ends...");              }      private void log(String msg){          logger.log(Level.INFO, msg);      }  }  

    程序主入口:

    [java] view plain copy print ? package com.yourcompany.spring1;    public class StaticProxy{      public static void main(String[] args) {          IHello proxy=new HelloProxy(new HelloImpl());          proxy.say("Lucy");      }  }  

    动态代理示例:

    接口:

    [java] view plain copy print ? package com.yourcompany.spring2;    public interface IHello{      public void say(String name);  }  

    实现:

    [java] view plain copy print ? package com.yourcompany.spring2;    public class HelloImpl implements IHello{      public void say(String name){          System.out.println("Hello,"+name);      }  }  

    动态代理:

    [java] view plain copy print ? package com.yourcompany.spring2;    import java.lang.reflect.InvocationHandler;  import java.lang.reflect.Method;  import java.lang.reflect.Proxy;    import org.apache.log4j.Level;  import org.apache.log4j.Logger;    public class HelloProxy implements InvocationHandler {      private Logger logger=Logger.getLogger(this.getClass().getName());      private Object targetObject;            public Object newProxy(Object targetObject){          this.targetObject = targetObject;          return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), this);      }      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {          log("hello method starts....");          //args是方法的参数          Object ret =  method.invoke(targetObject, args);          log("hello method ends...");                  return ret;      }      private void log(String msg){          logger.log(Level.INFO, msg);      }  }  

    程序主入口:

    [java] view plain copy print ? package com.yourcompany.spring2;    import com.yourcompany.spring2.HelloProxy;    public class DynamicProxy{      public static void main(String[] args) {          HelloProxy helloProxy=new HelloProxy();           IHello hello=(IHello)helloProxy.newProxy(new HelloImpl());          hello.say("Lucy");      }  }  

    上面两示例都需要用到的Log4j配置log4j.properties:

    [html] view plain copy print ? log4j.rootLogger=INFO,stdout  log4j.appender.stdout=org.apache.log4j.ConsoleAppender  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] -%m%n 
    转载请注明原文地址: https://ju.6miu.com/read-662711.html

    最新回复(0)