前面说了一下spring 代理,说的是JDK 的代理,这种代理方式只能通过接口代理,cglib 可以通过类代理,下面是代码:
// 承接上面的,假设我们要为上学这个业务,添加额外的功能,这里直接实用类 // 目标类 public class ServiceImpl implements Service{ public void goSchool(){ System.out.println("去上学"); } }
// 额外的一些方法 public class ServiceFactory { public static void before(){ System.out.println("吃早餐"); } public static void after(){ System.out.println("给爷爷奶奶打声招呼"); } }
// 动态代理工厂 public class CglibProxyFactory implements MethodInterceptor{ // 目标对象 private Object target; /** * 这里和JDK 绑定目标类 类似 * 仅仅是创建了一个以继承了目标类的新对象 * @param target * @return */ public Object bind(Object target){ this.target = target; // 这里说明一下如果用的cglib-2.2.0 就可以直接就能使用,如果用的其他版本,可 // 能需要asm的jar // org/objectweb/asm/Type错误 包括spring 的也是由于这两个jar 引起的 Enhancer enhancer = new Enhancer(); // 给Enhancer 属性赋值,内部会判断目标类的类型,目标类不要搞成final了,不然 // 无法实现 enhancer.setSuperclass(this.target.getClass()); // 当前对象CglibProxyFactory,必须要实现一个接口 enhancer.setCallback(this); // 这里是通过字节码进行 创建实例,参考AbstractClassGenerator里面的create 方 // 法 return enhancer.create(); } @Override public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy proxy) throws Throwable { ServiceFactory.before(); // 这里用的 MethodProxy Object obj = proxy.invokeSuper(arg0, arg2); ServiceFactory.after(); return obj; } }
public class Test { public static void main(String[] args) { // 这里无论是使用接口 还是 实现类都可以接收 // 这里我创建了接口 和实现类,都可以实现 Service service = (Service) new CglibProxyFactory().bind(new ServiceImpl()); service.goSchool(); // 这里顺便说说 spring aop 默认是jdk 的动态代理 // 要强制使用cglib的 ,设置 proxy-target-class="true" // 使用aop 一般在事务控制,和 业务层控制两个地方 } //参考:ciglib 源码 http://blog.csdn.net/liulin_good/article/details/6411201 }
小结:
这个可以代理接口和类,原理可以参考那个源码地址,效率估计要低点了!
这个其实都是老生常谈了,这个只是简单记录一下,嘿嘿,为后面的框架设计做准备~。~。
相关推荐
在这个问题中,我们遇到了两个关键的jar包:`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`。这两个jar包对于理解Spring框架的工作原理以及它们在实际应用中的作用至关重要。 首先,`spring-...
"spring-cglib-repack-3.2.5.jar"、"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"这三个文件是Spring源码阅读环境中常用的依赖包,它们各自承担着不同的功能。 首先,我们来看"CGLIB"...
在实际开发中,`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.5.1.jar`是Spring框架运行的必要组件,特别是对于那些使用AOP特性的项目。确保这两个jar包的正确引入,能有效避免因缺少依赖而导致的...
在提供的文件中,我们看到了两个与Spring相关的库:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个库都是Spring框架的重要组成部分,用于解决特定的编程问题。 首先,让我们来了解...
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是Spring框架在运行时依赖的两个关键库,它们主要涉及到动态代理和对象创建的优化。 1. **CGLIB(Code Generation Library)**: ...
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...
总之,"spring-cglib-repack-3.1.jar"和"spring-objenesis-repack-2.1.jar"是Spring 4.0框架的重要组成部分,它们分别提供了动态子类生成和快速对象实例化的能力,对于理解Spring的内部机制,尤其是AOP和对象生命...
总的来说,`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`是Spring框架的核心组成部分,它们提供了代理和对象实例化的底层支持。在进行Spring源码学习或开发时,确保这两个库的正确引入是至...
`spring-cglib-repack-3.2.6.jar`和`spring-objenesis-repack-2.6.jar`是Spring框架AOP功能的重要组成部分。CGlib负责在没有接口的情况下生成目标对象的子类,而Objenesis则协助在没有无参构造器的情况下快速实例化...
总之,`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.4.jar`在Spring框架中扮演着核心角色,主要负责AOP代理和复杂对象的实例化。了解这些库的作用和使用方法,有助于更好地理解和优化Spring应用。
总的来说,"spring-cglib-repack-3.2.0.jar"和"spring-objenesis-2.2.jar"是Spring框架中的关键组件,它们负责动态代理的实现,提高了代码的灵活性和可测试性。对这两个库的理解有助于提升对Spring框架整体运作机制...
10. 使用 Cglib 生成代理:在生成代理对象时,Spring AOP 也可以使用 Cglib 来生成代理对象。在这个过程中,Spring AOP 使用 Cglib Library 来生成代理对象。 Spring AOP 通过解析 Bean 定义文件、AOP 配置文件、...
总结,"spring-cglib-repack-3.2.5.jar" 和 "spring-objenesis-repack-2.5.1.jar" 是Spring框架中的重要组件,它们分别负责动态代理和无参实例化。了解这两个库的工作原理以及如何根据源码生成jar包,对于深入理解和...
总之,spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar是Spring源码编译的关键组成部分,它们为Spring的AOP代理功能提供了底层支持,特别是对于没有实现接口的类。正确地包含这些库可以确保顺利...
与AspectJ不同,Spring AOP默认使用代理模式(如JDK动态代理或CGLIB),但在配置后也能与AspectJ结合使用,利用AspectJ Weaver进行更强大的字节码织入。 最后,spring-aspects-4.3.6.RELEASE是Spring框架的另一个...
com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aspects-4.1.2.RELEASE.jar spring-web-4.1.2.RELEASE.jar /...
总的来说,`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个文件是Spring框架的重要组成部分,它们分别提供了字节码生成和快速对象创建的能力,对于Spring的AOP功能和测试支持起到了关键...
Spring-asm-repack和Spring-cglib-repack是Spring框架为了实现动态代理和增强类功能所使用的库。 ASM是一个Java字节码操控和分析框架,它可以直接生成和修改类的字节码。在Spring中,ASM主要用于AOP(面向切面编程...
总结来说,`spring-objenesis-repack-2.1.jar`和`spring-cglib-repack-3.1.jar`在Spring 4框架中起着至关重要的作用,它们提供了动态对象生成的能力,以支持Spring的AOP和依赖注入等核心功能。而`spring-core-4.1.3....
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...