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来生成