静态代理示例:
接口:
[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