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

一:委托者

 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 }

二:增强者(代理类)

 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 }

三:创造代理的工厂类

 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 }

四:测试类

 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 }

时间: 2024-10-08 20:05:02

spring源码学习之【准备】cglib动态代理例子的相关文章

Spring源码学习笔记(7)

Spring源码学习笔记(七) 前言-- 最近花了些时间看了<Spring源码深度解析>这本书,算是入门了Spring的源码吧.打算写下系列文章,回忆一下书的内容,总结代码的运行流程.推荐那些和我一样没接触过SSH框架源码又想学习的,阅读郝佳编著的<Spring源码深度解析>这本书,会是个很好的入门 写前说句话, 开篇不尴尬 ---- 接下的这一篇当中, 我们将来回顾 Spring 中 AOP 功能的实现流程.  早上精力充沛, 开始新一天的学习 \(^o^)/~ 接触过 Spri

Spring源码学习笔记(6)

Spring源码学习笔记(六) 前言-- 最近花了些时间看了<Spring源码深度解析>这本书,算是入门了Spring的源码吧.打算写下系列文章,回忆一下书的内容,总结代码的运行流程.推荐那些和我一样没接触过SSH框架源码又想学习的,阅读郝佳编著的<Spring源码深度解析>这本书,会是个很好的入门. 上一篇中我们梳理到 Spring 加载 XML 配置文件, 完成 XML 的解析工作,接下来我们将进入 Spring 加载 bean 的逻辑. 我们使用 Spring 获取 XML

Spring AOP高级——源码实现(1)动态代理技术

在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理. 动态代理实际上也是一种结构型的设计模式,JDK中已经为我们准备好了这种设计模式,不过这种JDK为我们提供的动态代理有2个缺点: 只能代理实现了接口的目标对象: 基于反射,效率低 鉴于以上2个缺点,于是就出现了第二种动态代理技术——CGLIB(Code Generation Library).这种代理技术一是不需要目标对象实现接口(这大大扩展了使用范围),二是它是基于字节码实现(这比反射效率高

Spring源码学习笔记(3)

Spring源码学习笔记(三) 前言----     最近花了些时间看了<Spring源码深度解析>这本书,算是入门了Spring的源码吧.打算写下系列文章,回忆一下书的内容,总结代码的运行流程.推荐那些和我一样没接触过SSH框架源码又想学习的,阅读郝佳编著的<Spring源码深度解析>这本书,会是个很好的入门. DispatcherServlet 实现核心功能 和普通的 Servelt 类一样, DispatcherServlet 中的 doGet() 和 doPost() 方法

Spring源码学习的初步体会

Spring源码学习的初步体会: 深入学习和巩固java的基础知识,其中的java知识范围全部,可以边研究源码边巩固复习基础知识 体会其中用到的设计思想:其中包含的设计原则和设计模式. 加深对spring的理解,在业务开发中使用spring更容易和深入,提高了生产率.

Spring源码学习笔记(5)

Spring源码学习笔记(五) 前言-- 最近花了些时间看了<Spring源码深度解析>这本书,算是入门了Spring的源码吧.打算写下系列文章,回忆一下书的内容,总结代码的运行流程.推荐那些和我一样没接触过SSH框架源码又想学习的,阅读郝佳编著的<Spring源码深度解析>这本书,会是个很好的入门 写下一句话,开篇不尴尬  ----  上篇文章中梳理到 Spring 加载资源文件后开始解析 Bean, 现在我们从两个解析函数 parseDefaultElement() 和 par

Spring 源码学习(二) IOC容器启动过程

这一节主要是记录一下Spring Ioc 容器的启动过程. Spring 的 Ioc 容器是怎么被加载和使用的? web容器为它提供了宿主环境 ServlectContext,  Tomcat 启动时会读取web.xml. 并且实例化web.xml中配置的ContextLoaderListener ,下面看一下ContextLoaderListener的创建过程: 在实例化ContextLoaderListener 之后,通过接口回调执行ContextLoaderListener 类中的cont

Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件

写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设计精巧,代码优美,值得每一名开发人员学习阅读. 在我最开始学习javaEE时,第一次接触Spring是从一个S(Struts)S(Spring)H(Herbinate)的框架开始.由java原生开发到框架开发转换过程中,那时我的印象里Struts负责控制层,herbinate负责数据层,而Sprin

Spring AOP中的JDK和CGLib动态代理哪个效率更高?

一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式. 自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方. JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler.其中,Invoc

spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能

一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了.--->JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理. 性能:--->jdk的动态代理由于jdk版本的升级,渐渐超越cglib 二:都说 Cglib 创建的动态代理的