CGLIB(Code Generation Library)是一个开源项目!
cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制, 可以是普通Java类,但是注意的是不能是非final Java类,cglib是通过继承来实现的代码增强,所代理类的方法不能使用private来修饰。
这里使用jar包:
cglib-2.2.jar
不需要使用spring参与,直接由原始的cglib通过继承增强代码类。
普通类文件:
import java.util.ArrayList; import java.util.List; public class Chinese /*implements Person*/ { protected String sayHello(String name) { System.out.println(name + ": running sayHello method "); return name + " Hello , Spring AOP(cglib)"; } void eat(String food) { System.out.println("I'm eating :" + food); } public List<String> getCharacters(String str) { List<String> list = new ArrayList<String>(4); int count = 0; while (count < 4) { list.add(str.charAt(count) + ""); count++; } System.out.println("check get characters running......"); return list; } } interface Person { String sayHello(String name); void eat(String food); List<String> getCharacters(String str); }
代理工厂类:
通过这个类合成/聚合复用原则将业务类和需要统一处理的横切面拦截器合成在一起:
import net.sf.cglib.core.DebuggingClassWriter; import net.sf.cglib.proxy.Enhancer; public class ProxyFactory { public static Object getProxyInstance(Class<?> clazz) { Enhancer en = new Enhancer(); // set target proxy en.setSuperclass(clazz); // set proxy interceptor en.setCallback(new AroundAdvice()); // create proxy instance Object o = en.create(); System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "R:\\a.class"); return o;//class com.cherrypicks.laneige.common.test3.Chinese$$EnhancerByCGLIB$$5bca626a } }
实际统一处理(拦截)方法类:
import java.lang.reflect.Method; import net.sf.cglib.core.DebuggingClassWriter; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class AroundAdvice implements MethodInterceptor { public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws java.lang.Throwable { System.out.println("-------before execute ,transaction start ..."); //execute target object method and save target object return value // Object rvt = proxy.invokeSuper(target, new String[] { "new parameter" }); Object rvt = proxy.invokeSuper(target, args); System.out.println("-------after execute, transaction end ..."); System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "R:\\"); return rvt; } }
最后实际调用、测试类:
import java.util.List; /** * interception AroundAdvice * @author zxbxiaobo@sina.com * time: 2015-05-25 17:03 */ public class CglibTest { /** * @param args */ public static void main(String[] args) { Chinese zh = (Chinese) ProxyFactory.getProxyInstance(Chinese.class); System.out.println(zh.sayHello("猪八戒")); System.out.println("\n"); zh.eat("大西瓜"); System.out.println("\n"); List<String> ss = zh.getCharacters("abcd"); System.out.println("\nreturn value:\n"); for (String s : ss) { System.out.println("character: \t" + s); } // check if generate cglib class file System.out.println(zh.getClass()); } }
=================
打印效果如下:
-------before execute ,transaction start ... 猪八戒: running sayHello method -------after execute, transaction end ... 猪八戒 Hello , Spring AOP(cglib) -------before execute ,transaction start ... I'm eating :大西瓜 -------after execute, transaction end ... -------before execute ,transaction start ... check get characters running...... -------after execute, transaction end ... return value: character: a character: b character: c character: d class com.cherrypicks.laneige.common.test3.Chinese$$EnhancerByCGLIB$$5bca626a
非常简单的逻辑代码,学习入门理解....
可以参考其他复杂实现方式,
http://www.blogjava.net/stone2083/archive/2008/03/16/186615.html
https://github.com/limingwei/li/blob/master/framework/li/aop/AopEnhancer.java
相关推荐
在Java中,JDK动态代理或CGLIB可以用来实现AOP。 在这个示例中,我们将利用动态代理来处理事务。首先,我们需要定义一个`Transaction`接口,包含开启、提交和回滚事务的方法。然后,我们可以创建一个`...
通过这种方式,我们可以实现简单的Spring AOP功能,而无需使用Spring框架提供的内置AOP支持。然而,对于更复杂的需求,如基于注解的切面或自定义通知类型,使用Spring AOP的完整功能会更为合适。在实际项目中,...
通过这样的简易AOP框架,开发者可以学习到AOP的基本思想和实现方式,了解如何在不修改原始代码的情况下,添加跨切面的关注点,提高代码的可维护性和复用性。同时,这也是一种实践面向切面编程理念的有益尝试,有助于...
AOP代理使得我们可以定义切面,实现在不修改原代码的情况下增强功能。 三、运行等待阶段 1. 容器启动:Spring容器在加载所有Bean并完成初始化后,会进入运行状态,等待外部请求或事件触发Bean的调用。 2. 生命周期...
Spring AOP主要通过代理模式实现,有JDK动态代理和CGLIB两种方式,前者针对接口,后者针对类。 “AOPMock”项目是对Spring AOP的一种学习与实践。项目中,我们可以看到作者是如何模仿Spring AOP的流程,实现自己的...
标题中的“简易搭建ssh框架”指的是使用Spring、Struts和Hibernate这三大开源框架构建一个Java Web应用程序的过程。SSH是这三大框架的首字母缩写,它们分别是Spring(用于依赖注入和事务管理)、Struts(用于MVC设计...
《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...
7. **XML配置与Java配置**:Spring支持XML和Java配置两种方式,模拟时可以考虑两者之一或同时实现,以展示配置的灵活性。 8. **代理模式**:在实现AOP时,我们需要了解和使用代理模式,如JDK动态代理和CGLIB代理,...
Spring框架是Java开发领域中的一个里程碑,它为开发者提供了一种优雅的方式来管理对象的生命周期和依赖关系,同时集成了面向切面编程(AOP)的功能,使得代码更加模块化和可维护。本文将深入探讨如何手写一个简单的...
- 通过CGLIB实现AOP机制。 - 使用Servlet模拟MVC请求映射。 4. **基于知识图谱的输入法推荐方法 - 华为 & 东南大学计算机学院** - 2020.11 ~ 2021.03 - 爬取并处理数据,构建用户知识图谱,实现输入法推荐功能...
1. **CGlib**:CGlib是一个强大的、高性能的代码生成库,它在许多AOP(面向切面编程)框架中被用作底层技术,如Spring AOP。在FakeStruts项目中,CGlib可能被用来创建动态代理,以实现对Action类的方法增强,比如在...