spring源码中是使用了动态代理的,至于动态代理使用的场景在此先不做分析,后续深入后再补充,本文只介绍spring容器启动后是怎么选择和创建动态代理的
一、spring注解启动类图
二、spring注解启动流程图
从流程图中可以很明确的看到spring容器在启动的过程中,在构造器初始化的时候通过判断
NativeDetector.inNativeImage()==true
是否为成立来创建简单初始化策略还是动态代理策略
展开NativeDetector.inNativeImage()函数可以看到
/** * A common delegate for detecting a GraalVM native image environment. * * <p>Requires using the {@code -H:+InlineBeforeAnalysis} native image compiler flag in order to allow code removal at * build time. * * @author Sebastien Deleuze * @since 5.3.4 */ public abstract class NativeDetector { // See https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java private static final boolean imageCode = (System.getProperty("org.graalvm.nativeimage.imagecode") != null); /** * Returns {@code true} if invoked in the context of image building or during image runtime, else {@code false}. */ public static boolean inNativeImage() { return imageCode; } }
当环境变量<org.graalvm.nativeimage.imagecode>不存在的时候,spring选择了动态代理策略.