基于jdk proxy的动态代理模式
2014-04-12 16:46
337 查看
代理模式 是spring AOP机制的实现基础,有必要学习一下。
有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理。
先看一组代码,
输出结果如下,
现在,我们提出需求,我们希望用户在每个操作的时候都记录日志
该怎么做?
我们这时就可以使用 动态代理机制 , 通过动态代理 Factory ( 相当于 Spring 容器 ) 来生成代理实例 。
由代理对象来完成该功能。
第一,JDK动态代理方式
有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理。
先看一组代码,
package com.sinosoft.proxy; public interface UserInterface { public abstract void add(); public abstract void delete(); } package com.sinosoft.proxy; public class UserInterfaceImpl implements UserInterface{ @Override public void add() { System.out.println("add add add"); } @Override public void delete() { // TODO Auto-generated method stub System.out.println("delete delete delete"); } }
输出结果如下,
现在,我们提出需求,我们希望用户在每个操作的时候都记录日志
该怎么做?
我们这时就可以使用 动态代理机制 , 通过动态代理 Factory ( 相当于 Spring 容器 ) 来生成代理实例 。
由代理对象来完成该功能。
第一,JDK动态代理方式
package com.sinosoft.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyFactory implements InvocationHandler{ private Object target; private ProxyFactory(){} public static ProxyFactory getInstance(){ //Runtime return new ProxyFactory(); } public Object getProxy(Class clazz){ Object proxy=Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this); return proxy; } @Override public Object invoke(Object object, Method method, Object[] params) throws Throwable { // TODO Auto-generated method stub Object retVal=null; try { System.out.println("before...."); retVal=method.invoke(target, params); System.out.println("ater....."); } catch (Exception e) { // TODO Auto-generated catch block System.out.println("exception....."); }finally{ System.out.println("finally...."); } return retVal; } } package com.sinosoft.proxy; import org.junit.Test; public class ProxyTest { @Test //public static void main(String[] args) { public void test1(){ UserInterfaceImpl userimpl=new UserInterfaceImpl(); userimpl.add(); userimpl.delete(); } //} @Test public void test2(){ ProxyFactory factory=ProxyFactory.getInstance(); UserInterface userinterface=(UserInterface)factory.getProxy(new UserInterfaceImpl().getClass()); System.out.println(userinterface.getClass()); userinterface.add(); userinterface.delete(); } }
相关文章推荐
- 设计模式---动态代理(基于JDK的动态代理)
- 结构型模式之代理模式(Proxy 与 JDK动态代理)
- 关于java中jdk中接口动态代理模式Proxy的剖析
- 基于Proxy的动态代理(Proxy 模式)
- java动态代理模式Proxy之JDK动态代理机制
- 设计模式之Proxy(代理):模拟JDK的动态代理
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- spring框架Proxy-代理模式(动态生成代理对象)
- java 代理模式 jdk动态代理
- Aop应用原理 JDK动态代理、代理模式与反射
- 基于JDK动态代理的深入了解
- Java设计模式--代理模式与JDK动态代理,cglib动态代理
- Java 代理模式-JDK动态代理-实现对请求中文乱码的处理
- 如何使用Proxy模式及Java内建的动态代理机制
- 代理模式和JDK动态代理
- Spring的代理模式及Spring AOP-JDKDynamicAopProxy
- dubbo源码之动态代理模式生成proxy过程
- Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)
- 代理模式及jdk动态代理原理
- Design Pattern—— Dynamic Proxy Pattern 动态代理模式