今日重翻 spring 的 AOP 实现,发现 5.0.8.RELEASE 版的 spring 代码变化了好多(相对 3.X 版)。跟进了 AOP 的实现,发现 CglibAopProxy 多了个子类 ObjenesisCglibAopProxy
看下注释,原来从 4.0 版就引入了 Objenesis
/**
* Objenesis-based extension of {@link CglibAopProxy} to create proxy instances
* without invoking the constructor of the class.
*
* @author Oliver Gierke
* @author Juergen Hoeller
* @since 4.0
*/
看下 官网 的介绍, Objenesis 是款弥补 JDK 的不足而诞生的。比如,有些类没有无参构造器,class.newInstance是无法生成对象,这时 Objenesis 就可以大显神功了。
但是 Spring 没有直接引入 Objenesis,而是做了内部集成和封装,具体应用是 SpringObjenesis
而且该类还提供了缓存功能
/**
* Spring-specific variant of {@link ObjenesisStd} / {@link ObjenesisBase},
* providing a cache based on {@code Class} keys instead of class names,
* and allowing for selective use of the cache.
*
* @author Juergen Hoeller
* @since 4.2
* @see #isWorthTrying()
* @see #newInstance(Class, boolean)
*/
public class SpringObjenesis implements Objenesis {
……
}