要想了解Spring Aop 我们不得不从什么是AOP说起,其实听AOP也不是一天两天了,但是真正的去了解一些东西好像也就是最近那么就先从概念性质的介绍起:
/** * 静态代理测试 * @author 陈丽娜 * */ public class HelloStaticProxy implements HelloWorld{ //持有被代理对象的引用 private HelloWorldImpl helloWorldImpl; /** * 构造函数,初始化时确定被代理的类 * @param helloWorldImpl */ public HelloStaticProxy(HelloWorldImpl helloWorldImpl){ this.helloWorldImpl=helloWorldImpl; } @Override public void sayHello(String name) { before(); helloWorldImpl.sayHello(name); after(); } private void before() { System.out.println("Before"); } private void after() { System.out.println("After"); } }
/** * JDK动态代理 * @author 陈丽娜 * */ public class HelloJDKProxy implements InvocationHandler { //定义代理目标 private Object target; public HelloJDKProxy(Object target){ this.target = target; } /** * 获取代理对象 * @return */ public <T> T getProxy(){ return (T) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object result = method.invoke(target,args); after(); /* System.out.println("JDK实现动态代理==" + result); System.out.println("JDK动态代理方法==" + method);*/ return result; } private void before() { System.out.println("JDK实现动态代理Before"); } private void after() { System.out.println("JDK实现动态代理After"); } }
/** * CGLib动态代理 * @author 陈丽娜 * */ public class HelloCGLibProxy implements MethodInterceptor { //定义全局的代理类 private static HelloCGLibProxy instance = new HelloCGLibProxy(); private HelloCGLibProxy(){ } public static HelloCGLibProxy getInstance(){ return instance; } /** * 通过泛型获取代理目标的类型 * @param clazz * @return */ @SuppressWarnings("unchecked") public <T> T getProxy(Class<T> clazz) { return (T) Enhancer.create(clazz, this); } @Override public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(target,args); after(); /* System.out.println("CGLib动态代理==" + result); System.err.println("target===" + target + "method===" + method + "proxy==" + proxy);*/ return result; } private void before() { System.out.println("CGLib实现动态代理Before"); } private void after() { System.out.println("CGLib实现动态代理After"); } }
/** * 静态代理使用测试 */ @Test public void StaticProxyTest(){ HelloWorld helloWorldStaticProxy = new HelloStaticProxy(new HelloWorldImpl()); helloWorldStaticProxy.sayHello("静态代理===陈丽娜"); } /** * JDK动态代理使用测试 */ @Test public void JDKProxyTest(){ HelloWorld helloWorld = new HelloJDKProxy(new HelloWorldImpl()).getProxy(); helloWorld.sayHello("JDK代理===陈丽娜"); } /** * CGLib动态代理使用测试 */ @Test public void CGlibProxyTest(){ HelloWorld helloWorld = HelloCGLibProxy.getInstance().getProxy(HelloWorldImpl.class); helloWorld.sayHello("CGLib代理===陈丽娜"); }
Before Hello静态代理===陈丽娜 After JDK实现动态代理Before HelloJDK代理===陈丽娜 JDK实现动态代理After CGLib实现动态代理Before HelloCGLib代理===陈丽娜 CGLib实现动态代理After
原文:http://blog.csdn.net/jly4758/article/details/44655725