源码分析:
由启动类进入:
紧接着,我们看看new SpringApplication(sources)里面做了什么:
这就是ApplicationContextInitializer的加载方法,让我们先进去getSpringFactoriesInstances里面看看:
进入第6步的SpringFactoriesLoader.loadFactoryNames方法,我们发现:
factoryClassName=org.springframework.context.ApplicationContextInitializer
就是去找META-INF/spring.factories中:
拿到数据后,我们返回看第6步中的方法:createSpringFactoriesInstances,其中parameterTypes=[],这个参数主要是用来做反射实例化时,调用无参构造进行实例化的:
将所有类实例化完成之后返回到第4步,并添加到SpringApplication类的属性initializers集合中去
那么,这个集合在哪儿用到呢,我们就顺着代码往下找,回到第3步的run方法,一直往下找
来到第11步的方法:prepareContext,跟进去我们看看:
看到这个方法:applyInitializers没有?这个就是到了用到ApplicationContextInitializer的时候到了,那么我们在跟着进去看:
那我们看看这个方法:getInitializers里面干了些啥:
看到没有,this.initializers,其实就是前面第10步中的this.initializers,将这个list集合转成了set集合返回了,来到第13步中:
遍历里面就会执行initializer.initialize(context)方法,就会发现每一个ApplicationContextInitializer必定会实现initialize方法,如下图:
那么,是不是一目了然,so easy~~~~~