文章出處
文章列表
Spring AOP 主要用到的 動態代理,在spring aop的實現中,采用了兩種方式,一種是基于接口的動態代理,另外
一種是基于類的動態代理。
在談動態代理前,先談下設計模式中的代理模式:
代理模式:為另一對象提供一個替身或占位符以控制對這個對象的訪問。
類圖如下:
1,基于接口的動態代理必須首先要定義接口:
代碼如下:
package com.tong.qiu.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by ywb */ public interface Subject { void doSomething(); void somethingElse(String arg); } class DynamicProxyHandler implements InvocationHandler { private Object proxied; public DynamicProxyHandler(Object proxied) { this.proxied = proxied; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("**** proxy: " + proxy.getClass() + ", method: " + method + ", args: " + args); if(args != null) for(Object arg : args) System.out.println(" " + arg); return method.invoke(proxied, args); } } class RealObject implements Subject { public void doSomething() { System.out.println("doSomething"); } public void somethingElse(String arg) { System.out.println("somethingElse " + arg); } } class SimpleDynamicProxy { public static void consumer(Subject iface) { iface.doSomething(); iface.somethingElse("bonobo"); } public static void main(String[] args) { RealObject real = new RealObject(); consumer(real); Subject proxy = (Subject) Proxy.newProxyInstance(//此處生成代理對象 Subject.class.getClassLoader(), new Class[]{ Subject.class }, new DynamicProxyHandler(real)); consumer(proxy); } }
2.基于類的動態代理
spring 使用CGLIB來生成
文章列表
全站熱搜