Spring AOP 之CGLIB实例

Spring AOP 之CGLIB实例

 

使用的是CGLIB代理

 

      1. Advice类要实现MethodInterceptor接口

      2. 要自己定义一个代理工厂,用于配置target和Advice

 

 

业务类

package com.yeepay.porxy.cglib.test;

import java.util.HashMap;
import java.util.Map;

/**
 * 目标类,(委托类)
 * @author shangxiaofei
 *
 */
public class PaymentServer {

    public Map<String, String> payMoney(String name,Integer money){
        System.out.println("paymentServer.payMoney()付钱=========>名字【"+name+"】,money=【"+money+"】");
        Map<String, String> map=new HashMap<String, String>();
        map.put("result", "已经完成付钱");
        return map;
    }
}

 

Advice类

package com.yeepay.porxy.cglib.test;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
 * 增强类
 * @author shangxiaofei
 *
 */
public class PoxyForService implements MethodInterceptor{

    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2,MethodProxy arg3) throws Throwable {
          // 增强功能的代码
        System.out.println("PoxyForService.intercept(方法执行前执行========>向统计发送消息)");
        if(arg2!=null&&arg2.length>0){
            for(int i=0;i<arg2.length;i++){
                System.out.println("PoxyForService.intercept()发送的参数内容====>"+arg2[i]);
            }
        }
        
        
        //执行方法内容
        Object object=arg3.invokeSuper(arg0, arg2);
        
        
        System.out.println("PoxyForService.intercept(方法执行后执行=======>计算时间)");
        return object;
    }
    
    

}

 

代理的工厂类

package com.yeepay.porxy.cglib.test;

import net.sf.cglib.proxy.Enhancer;

/**
 * 代理实现工厂类
 * @author shangxiaofei
 *
 */
public class PoxyFactory {
     public static PaymentServer getPaymentServer(){
         // Cglib 核心类,生成代理对象
        Enhancer enhancer= new Enhancer();
         // 为核心类对象中放入需要代理的委托类的类对象
        enhancer.setSuperclass(PaymentServer.class);
         // 为核心类对象中放入增强功能的类对象
        enhancer.setCallback(new PoxyForService());
         // 从核心类对象中获取委托类的代理对象
        Object object=enhancer.create();
        
        return (PaymentServer) object;
     }
}

 

测试类

package com.yeepay.porxy.cglib.test;

import java.util.Map;
/**
 * 测试类
 * @author shangxiaofei
 *
 */
public class TestController {

    private PaymentServer paymentServer=PoxyFactory.getPaymentServer();
    
    public void payment(){
        System.out.println("TestController.payment()开始");
        Map<String, String> map=paymentServer.payMoney("怪物雷克", 100);
        System.out.println("TestController.payment()结束===>"+map.get("result"));
    }
    
    
    /**
     * TestController.payment()开始
     * PoxyForService.intercept(方法执行前执行========>向统计发送消息)
     * PoxyForService.intercept()发送的参数内容====>怪物雷克
     * PoxyForService.intercept()发送的参数内容====>100
     * paymentServer.payMoney()付钱=========>名字【怪物雷克】,money=【100】
     * PoxyForService.intercept(方法执行后执行=======>计算时间)
     * TestController.payment()结束===>已经完成付钱
     * @param args
     */
    public static void main(String[] args) {
        TestController testController=new TestController();
        testController.payment();
    }
}

 

 

spring--AOP
您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多