今天闲着没事翻Spring源代码的时候,又看到了InstantiationStrategy这个接口。
这个接口的实现类是用来实例化bean的。看了一下,发现在spring里面有有这个接口的实现层次是这样的:
<<Interface>>InstantiationStrategy
|
|
SimpleInstantiationStrategy
|
|
CglibSubclassingInstantiationStrategy
对于CglibSubclassingInstantiationStrategy,有这么一句注释:
Default object instantiation strategy for use in BeanFactories.
这个与SimpleInstantiationStrategy最大的区别是支持Method Injection. 其中Method Injection的实现
需要依靠Cglib.具体代码就不贴了。总之就是通过Cglib重新生成一个原来的类的子类,在新的类中对需要注入的方法
进行了overwrite.
到了这里,自然而然的也就想到了Cglib在Spring中另外一处重要的应用,那就是aop.
Spring 的aop的代理方式有两种可以选择,一是JdkDynamicProxy,另一个就是CglibProxy.
在aop中bean的代理生成最终发生在DefaultAopProxyFactory这个类中,代码如下:
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
if (targetClass.isInterface()) {
return new JdkDynamicAopProxy(config);
}
if (!cglibAvailable) {
throw new AopConfigException(
"Cannot proxy target class because CGLIB2 is not available. " +
"Add CGLIB to the class path or specify proxy interfaces.");
}
return CglibProxyFactory.createCglibProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}
可以看到,当bean中设置proxyTargetClass属性为true,或者bean本什么没有implements任何接口(以及其他一些 比较特殊情况optimize,啊哈我不知道这个optimise是干什么用的),那么将采用cglib的代理方式。否则采用JdkDynamicProxy代理方式。值得注意的是当bean只是一个接口的时候,将采用JdkDynamicProxy方式。
既然说到这里了,就顺便把两种代理方式也比较一下吧。从概念上来说,java 动态代理是通过接口代理的方式,产生一个
和被代理类有相同接口的类。原理就是通过InvocationHandler接口的方式控制对原来的class的method的访问,
在访问前后加入我们自定义的行为。
而cglib则是通过操作字节码的方式生成一个原来的class的subclass.原理也是把我们自定义的MethodInterceptor加入到新生成的类的里面去。
分享到:
相关推荐
org.springframework.asm.AnnotationVisitor org.springframework.cglib.core.ClassGenerator
"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.5.jar"和"spring-objenesis-repack-2.6.jar"是Spring框架在运行时依赖的两个关键库,它们主要涉及到动态代理和对象创建的优化。 1. **CGLIB(Code Generation Library)**: ...
解决这个问题的方法通常是将`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`添加到你的项目构建路径中,如果是Maven或Gradle项目,可以在pom.xml或build.gradle文件中声明对应的依赖。...
在给定的标题和描述中,提到了两个关键的jar包:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个文件对于理解Spring框架的内部机制以及如何在IDEA中构建Spring源码至关重要。 首先...
在提供的文件中,我们看到了两个与Spring相关的库:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个库都是Spring框架的重要组成部分,用于解决特定的编程问题。 首先,让我们来了解...
在深入理解`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.5.1.jar`这两个jar包之前,我们先来了解一下Spring框架的核心概念。 Spring框架的核心包括依赖注入(Dependency Injection,DI)和面向切...
spring-cglib-repack-3.2.6.jar 文件大小:313502 字节 修改时间:2018年8月26日 09:12:09 MD5 :1F3A42309EC16632954291B584778432 SHA1 :7A9601D36541798180C2AFC4DA34A78237F5C0AA CRC32 :675C7EB7 spring-...
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...
标题 "spring-cglib-repack-3.2.0.jar" 和 "spring-objenesis-2.2.jar" 指的是两个在Spring框架源代码构建过程中常用的库。这两个库在Spring框架的运行和开发中起着至关重要的作用。 首先,让我们详细了解一下...
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...
当我们在研究或编译Spring 4.0的源码时,可能会遇到一些依赖问题,其中"spring-cglib-repack-3.1.jar"和"spring-objenesis-repack-2.1.jar"是两个关键的jar包,它们在源码编译过程中起着至关重要的作用。本文将详细...
在Spring框架的高版本源码分析过程中,可能会遇到缺少特定库的情况,比如"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个文件。这些文件是Spring框架运行时的重要组成部分,对于理解和...
首先,`CGLIB`(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被用到,如Spring AOP,用于创建对象的代理以实现方法拦截。当Spring需要对非接口类进行代理时,通常...
在Spring框架中,`spring-cglib-repack-3.2.6.jar`和`spring-objenesis-repack-2.6.jar`是两个重要的依赖库,它们在Spring源码环境中扮演着不可或缺的角色。本文将详细介绍这两个库以及它们在Spring框架中的作用。 ...
spring源码深度分析源码依赖,将cglib和objenesis重新打包处理。同时添加grandle依赖:compile fileTree(dir: 'libs', include: ['*.jar'])
然而,有时候在导入Spring项目时,可能会遇到一些问题,例如标题中提到的"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个jar包的缺失。这些jar包对于Spring框架的正常运行至关重要,因为...
在本案例中,"Spring源码编译缺少的两个包:spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar"揭示了这两个关键的库对于Spring源码编译是必不可少的。下面将详细讲解这两个库的作用及其在Spring中的...
`spring-cglib-repack-3.1.jar` 是Spring框架中的一个重要组件,它与动态代理有关。CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,用于在运行期扩展Java类与实现Java接口。在Spring中,CGLIB...
而`spring-cglib-repack-3.2.5.jar`和`spring-objenesis-repack-2.6.jar`这两个文件是Spring框架中两个重要的依赖包,它们分别涉及到CGlib和Objenesis两个库,这两个库在Spring中的作用不可小觑。 **CGlib(Code ...