spring源码学习之【准备】cglib动态代理例子

简介: 一:委托者 1 package com.yeepay.porxy.cglib.test; 2 3 import java.util.HashMap; 4 import java.

一:委托者

 1 package com.yeepay.porxy.cglib.test;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  * 目标类,(委托类)
 8  * @author shangxiaofei
 9  *
10  */
11 public class PaymentServer {
12 
13     public Map<String, String> payMoney(String name,Integer money){
14         System.out.println("paymentServer.payMoney()付钱=========>名字【"+name+"】,money=【"+money+"】");
15         Map<String, String> map=new HashMap<String, String>();
16         map.put("result", "已经完成付钱");
17         return map;
18     }
19 }
View Code

二:增强者(代理类)

 1 package com.yeepay.porxy.cglib.test;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 import net.sf.cglib.proxy.MethodInterceptor;
 6 import net.sf.cglib.proxy.MethodProxy;
 7 /**
 8  * 增强类
 9  * @author shangxiaofei
10  *
11  */
12 public class PoxyForService implements MethodInterceptor{
13 
14     @Override
15     public Object intercept(Object arg0, Method arg1, Object[] arg2,MethodProxy arg3) throws Throwable {
16           // 增强功能的代码
17         System.out.println("PoxyForService.intercept(方法执行前执行========>向统计发送消息)");
18         if(arg2!=null&&arg2.length>0){
19             for(int i=0;i<arg2.length;i++){
20                 System.out.println("PoxyForService.intercept()发送的参数内容====>"+arg2[i]);
21             }
22         }
23         
24         
25         //执行方法内容
26         Object object=arg3.invokeSuper(arg0, arg2);
27         
28         
29         System.out.println("PoxyForService.intercept(方法执行后执行=======>计算时间)");
30         return object;
31     }
32     
33     
34 
35 }
View Code

三:创造代理的工厂类

 1 package com.yeepay.porxy.cglib.test;
 2 
 3 import net.sf.cglib.proxy.Enhancer;
 4 
 5 /**
 6  * 代理实现工厂类
 7  * @author shangxiaofei
 8  *
 9  */
10 public class PoxyFactory {
11      public static PaymentServer getPaymentServer(){
12          // Cglib 核心类,生成代理对象
13         Enhancer enhancer= new Enhancer();
14          // 为核心类对象中放入需要代理的委托类的类对象
15         enhancer.setSuperclass(PaymentServer.class);
16          // 为核心类对象中放入增强功能的类对象
17         enhancer.setCallback(new PoxyForService());
18          // 从核心类对象中获取委托类的代理对象
19         Object object=enhancer.create();
20         
21         return (PaymentServer) object;
22      }
23 }
View Code

四:测试类

 1 package com.yeepay.porxy.cglib.test;
 2 
 3 import java.util.Map;
 4 /**
 5  * 测试类
 6  * @author shangxiaofei
 7  *
 8  */
 9 public class TestController {
10 
11     private PaymentServer paymentServer=PoxyFactory.getPaymentServer();
12     
13     public void payment(){
14         System.out.println("TestController.payment()开始");
15         Map<String, String> map=paymentServer.payMoney("怪物雷克", 100);
16         System.out.println("TestController.payment()结束===>"+map.get("result"));
17     }
18     
19     
20     /**
21      * TestController.payment()开始
22      * PoxyForService.intercept(方法执行前执行========>向统计发送消息)
23      * PoxyForService.intercept()发送的参数内容====>怪物雷克
24      * PoxyForService.intercept()发送的参数内容====>100
25      * paymentServer.payMoney()付钱=========>名字【怪物雷克】,money=【100】
26      * PoxyForService.intercept(方法执行后执行=======>计算时间)
27      * TestController.payment()结束===>已经完成付钱
28      * @param args
29      */
30     public static void main(String[] args) {
31         TestController testController=new TestController();
32         testController.payment();
33     }
34 }
View Code

 

相关文章
|
16天前
|
Java 应用服务中间件 Nacos
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
Spring Cloud 常用各个组件详解及实现原理(附加源码+实现逻辑图)
30 0
|
19天前
|
监控 数据可视化 安全
一套成熟的Spring Cloud智慧工地平台源码,自主版权,开箱即用
这是一套基于Spring Cloud的智慧工地管理平台源码,具备自主版权,易于使用。平台运用现代技术如物联网、大数据等改进工地管理,服务包括建设各方,提供人员、车辆、视频监控等七大维度的管理。特色在于可视化管理、智能报警、移动办公和分布计算存储。功能涵盖劳务实名制管理、智能考勤、视频监控AI识别、危大工程监控、环境监测、材料管理和进度管理等,实现工地安全、高效的智慧化管理。
|
1天前
|
存储 前端开发 Java
Spring Boot自动装配的源码学习
【4月更文挑战第8天】Spring Boot自动装配是其核心机制之一,其设计目标是在应用程序启动时,自动配置所需的各种组件,使得应用程序的开发和部署变得更加简单和高效。下面是关于Spring Boot自动装配的源码学习知识点及实战。
11 1
|
2天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
41 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
10天前
|
设计模式 安全 Java
【初学者慎入】Spring源码中的16种设计模式实现
以上是威哥给大家整理了16种常见的设计模式在 Spring 源码中的运用,学习 Spring 源码成为了 Java 程序员的标配,你还知道Spring 中哪些源码中运用了设计模式,欢迎留言与威哥交流。
|
10天前
|
XML Java 数据格式
Spring学习__一篇足矣
Spring学习__一篇足矣
Spring学习__一篇足矣
|
14天前
|
Java 数据安全/隐私保护 Sentinel
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流
|
14天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
15天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
15天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架