spring动态代理的cglib方法


1、被代理类Person.java

 1 package com.xiaostudy;
 2
 3 /**
 4  * @desc 被代理类
 5  *
 6  * @author xiaostudy
 7  *
 8  */
 9 public class Person {
10
11     public void add() {
12         System.out.println("add()>>>>>>>>");
13     }
14
15     public void update() {
16         System.out.println("update()>>>>>>>>");
17     }
18
19     public void delete() {
20         System.out.println("delete()>>>>>>>>");
21     }
22
23 }

2、切面类MyAdvice.java

 1 package com.xiaostudy;
 2
 3 /**
 4  * @desc 切面类
 5  *
 6  * @author xiaostudy
 7  *
 8  */
 9 public class MyAdvice {
10
11     /**
12      * @desc 植入代理方法的方法
13      */
14     public void before() {
15         System.out.println("日记开始>>>>>>>>>>>");
16     }
17
18     public void after() {
19         System.out.println("日记结束<<<<<<<<<<<<");
20     }
21
22 }

3、代理工厂类MyBeanFactory.java

 1 package com.xiaostudy;
 2
 3 import java.lang.reflect.Method;
 4
 5 import org.springframework.cglib.proxy.Enhancer;
 6 import org.springframework.cglib.proxy.MethodInterceptor;
 7 import org.springframework.cglib.proxy.MethodProxy;
 8
 9 /**
10  * @desc 代理工厂类
11  *
12  * @author xiaostudy
13  *
14  */
15 public class MyBeanFactory {
16     /**
17      * @desc 获取一个代理的对象
18      *
19      * @return Person对象
20      */
21     public static Person createPerson() {
22         // 被代理类
23         final Person person = new Person();
24         // 切面类
25         final MyAdvice myAdvice = new MyAdvice();
26         // 代理类,采用cglib
27         // 核心类
28         Enhancer enhancer = new Enhancer();
29         // 确定父类
30         enhancer.setSuperclass(person.getClass());
31         /*
32          * 设置回调函数 , MethodInterceptor接口 等效 InvocationHandler
33          *                 接口 intercept() 等效 invoke()
34          *                     参数1、参数2、参数3:以invoke一样
35          *                     参数4:methodProxy 方法的代理
36          */
37         enhancer.setCallback(new MethodInterceptor() {
38
39             @Override
40             public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
41                     throws Throwable {
42                 myAdvice.before();
43                 Object obj = method.invoke(person, args);
44                 // 这个与上面 等价
45                 // Object obj2 = methodProxy.invokeSuper(proxy, args);
46                 myAdvice.after();
47                 return obj;
48             }
49         });
50         // 创建代理
51         Person obj = (Person) enhancer.create();
52
53         return obj;
54     }
55
56 }

4、测试类Test.java

 1 package com.xiaostudy;
 2
 3 /**
 4  * @desc 测试类
 5  *
 6  * @author xiaostudy
 7  *
 8  */
 9 public class Test {
10
11     public static void main(String[] args) {
12         Person person = MyBeanFactory.createPerson();
13         person.add();
14         person.update();
15         person.delete();
16     }
17
18 }


spring动态代理的cglib方法

原文地址:https://www.cnblogs.com/xiaostudy/p/9535208.html

时间: 2024-08-18 00:19:09

spring动态代理的cglib方法的相关文章

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类

Java进阶之 JDK动态代理与Cglib动态代理

一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern]), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意: 1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于AspectJ较差 二.JDK动态代理 [对有实现接口的对象做代理] 1.JDK动态代理中 需要了解的

Java动态代理与Cglib库

JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.  按照代理的创建时期,代理类可以分为两种.  静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 

AOP学习心得&amp;jdk动态代理与cglib比较

什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系.例如日志功能.日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无

JDK动态代理与Cglib库

JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.  按照代理的创建时期,代理类可以分为两种.  静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 

JDK动态代理与Cglib动态代理(转载)

spring容器通过动态代理再结合java反射思想可以使得方法调用更加简洁 一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern](博主), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意:       1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于Aspe

Java动态代理、CGLIB动态代理

开篇 Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 2 个优势: 可以隐藏委托类的实现 可以实现客户与委托类之间的解耦, 在不修改委托类代码的情况下能够做一些额外的处理 我们举个很常见的例子: 工厂会生产很多的玩具, 但是我们买玩具都是到商店买的, 而不是到工厂去买的, 工厂怎么生产我们并不关心, 我们只知道到商店可以买到自己想要的玩具,并且,如果我们需要送人的话商店可以把这些玩具使用礼品盒包装.这个工厂就是

Spring 动态代理 之 but was actually of type &#39;com.sun.proxy.$Proxy14 Exception

今天在写Spring的引介代理的时候,报了一个错: Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'inter1' is expected to be of type 'com.dengchengchao.springtest.intertest.Inter1Impl' but was actually of type 'co