您的位置:首页 > 编程语言 > Java开发

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

2016-07-10 11:04 405 查看
静态代理示例:

接口:

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息