静态代理示例:
接口:
package com.yourcompany.spring1;
public interface IHello {
public void say(String name);
}
实现:
package com.yourcompany.spring1;
public class HelloImpl implements IHello{
public void say(String name){
System.out.println("Hello,"+name);
}
}
静态代理:
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);
}
}
程序主入口:
package com.yourcompany.spring1;
public class StaticProxy{
public static void main(String[] args) {
IHello proxy=new HelloProxy(new HelloImpl());
proxy.say("Lucy");
}
}
动态代理示例:
接口:
package com.yourcompany.spring2;
public interface IHello{
public void say(String name);
}
实现:
package com.yourcompany.spring2;
public class HelloImpl implements IHello{
public void say(String name){
System.out.println("Hello,"+name);
}
}
动态代理:
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);
}
}
程序主入口:
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:
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