首页 > 编程语言 > 详细

Spring学习笔记(4)

时间:2020-02-29 15:15:56      阅读:59      评论:0      收藏:0      [点我收藏+]

使用动态代理来对原方法进行增强

首先创建一个Productor类用于测试,

public class ProductorImpl implements Productor {

    public void sale(Double money) {
        System.out.println("厂家:"+money);
    }

    public void afterSale(Double money) {
        System.out.println("代理商:"+money);
    }

}

用CGLib动态代理来进行增强
package com.mine.proxy;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class CglibProxyTest {
    
    public static void main(String[] args) {
        
        //创建子类对象
        final ProductorImpl pr = new ProductorImpl();
        /**
         * 用Enhance类来进行增强
         *     create方法
         * 参数
         *     1.类的获取
         *  2.callback 的子接口 MethodInterceptor
         *  
         */
        ProductorImpl pro = (ProductorImpl)Enhancer.create(pr.getClass(), new MethodInterceptor() {
            /**
             * 用来进行增强
             * MethodProxy 被代理对象
             */
            public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
                Object returnValue = null;
                if("sale".equals(method.getName())) {    
                    double m = (Double)arg2[0];
                    returnValue=method.invoke(pr, m/2);
                }
                return returnValue;
            }
        });
        pro.sale(1000.0);
    }    

}

 

用JDK动态代理进行增强

package com.mine.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyTest {

    public static void main(String[] args) {
        final ProductorImpl productor = new ProductorImpl();
        
        /**
         * 实现jdk动态代理技术 使用反射方法 生成代理对象
         * 1.通过proxy这个类中newProxyInstance()
         * 参数:
         *         1)实现类的ClassLoader
         *         2)实现类的接口
         *         3)创建InvocationHandler
         * 
         */
        Productor pro = (Productor)Proxy.newProxyInstance(productor.getClass().getClassLoader(), 
                            productor.getClass().getInterfaces(), new InvocationHandler() {
                                
                                //这个方法就是用来增强内容的方法
                                /**
                                 * proxy代理对象
                                 * method执行方法
                                 * args获取到的执行方法需要传递的参数
                                 */
                                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                    Object returnValue = null;
                                    if("sale".equals(method.getName())) {
                                        Double money =  (Double) args[0];
                                        returnValue = method.invoke(productor, money*0.8);
                                    }
                                    return returnValue;
                                }
                            });
        pro.sale(10000.0);
    }
}

 

反射的原理暂时还是似懂非懂的感觉,而运用则比较好理解,就是给出方法名和类名,通过代理找到类和方法去执行,在接下来Spring AOP的学习中,反射也是需要前置学习的部分,不需要完全掌握,但要大抵知道是怎么运作的。

Spring学习笔记(4)

原文:https://www.cnblogs.com/HJYDR/p/12382813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!