Spring的代理模式(静态代理和动态代理)
2016-07-10 11:04
405 查看
静态代理示例:
接口:
实现:
静态代理:
程序主入口:
package com.yourcompany.spring1;
public class StaticProxy{
public static void main(String[] args) {
IHello proxy=new HelloProxy(new HelloImpl());
proxy.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
接口:
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
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- JDK动态代理VS CgLib
- Spring AOP动态代理-切面
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- C# 设计模式系列教程-代理模式
- 动态代理的5模式使用示例和Mixin模式
- 学习JavaScript设计模式之代理模式
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解