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

 

相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
68 2
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
14天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
30 2
|
22天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
33 4
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
62 9
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
39 9
|
26天前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
29 0
|
2月前
|
Java 数据安全/隐私保护 Spring
Spring进阶:初识动态代理
本文介绍了Spring框架中AOP切面编程的基础——动态代理。通过定义Vehicle接口及其实现类Car和Ship,展示了如何使用动态代理在不修改原代码的基础上增强功能。文章详细解释了动态代理的工作原理,包括通过`Proxy.newProxyInstance()`方法创建代理对象,以及`InvocationHandler`接口中的`invoke()`方法如何处理代理对象的方法调用。最后,通过一个测试类`TestVehicle`演示了动态代理的具体应用。
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
23 1
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
97 2