refresh((ApplicationContext) context);
refreshContext(context)<br>
applicationContext.refresh();
public void refresh() throws BeansException, IllegalStateException {<br> synchronized(this.startupShutdownMonitor) {<br> // context设置 启动日期/当前状态/初始环境/验证<br> this.prepareRefresh();<br> // 创建一个bean工程,<br> ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();<br> this.prepareBeanFactory(beanFactory);<br><br> try {<br> // 注册scope <br> this.postProcessBeanFactory(beanFactory);<br> // 调用所有bean工厂,对bean进行处理<br> this.invokeBeanFactoryPostProcessors(beanFactory);<br> // 拦截bean,<br> this.registerBeanPostProcessors(beanFactory);<br> // 国际化操作<br> this.initMessageSource();<br> // 广播事件<br> this.initApplicationEventMulticaster();<br> // 特殊bean 比如tomcat<br> this.onRefresh();<br> // 注册监听器<br> this.registerListeners();<br> this.finishBeanFactoryInitialization(beanFactory);<br> this.finishRefresh();<br> }<br>
super.refresh();
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);<br>
继续跟进方法:invokeBeanFactoryPostProcessors
postProcessBeanDefinitionRegistry
processConfigBeanDefinitions(registry);
331:parser.parse(candidates);//解析候选配置
if (bd instanceof AnnotatedBeanDefinition) {<br> parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName());<br> }<br> else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) {<br> parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName());<br> }<br> else {<br> parse(bd.getBeanClassName(), holder.getBeanName());<br> }//谁便选一条即可
parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName());
processConfigurationClass
sourceClass = doProcessConfigurationClass(configClass, sourceClass, filter);
递归处理配置类及其超类层次结构
点进去这个类你会发现注解的处理是在这里进行的
我们现在只关心线路一中的public String[] selectImports(AnnotationMetadata annotationMetadata) {}是哪里调用的
我们知道,在主启动类上的import注解里面会加载配置类,那么谁来调用加载呢?
找到310行,对于@Import注解的处理<br>
processImports(configClass, sourceClass, getImports(sourceClass), filter, true);
581:String[] importClassNames = selector.selectImports(currentSourceClass.getMetadata());<br>
是不是又回到了最初的起点?
registerBeanPostProcessors(beanFactory);
registerListeners();
public ConfigurableApplicationContext run(String... args) {<br> // 创建计时器<br> StopWatch stopWatch = new StopWatch();<br> stopWatch.start();<br> <br> ConfigurableApplicationContext context = null;<br> Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();<br> // 设置属性<br> this.configureHeadlessProperty();<br> <br> // spring中监听器的使用,这些对象想创建,就得知道监听器的全路径<br> // 会从spring.factory中读取<br> SpringApplicationRunListeners listeners = this.getRunListeners(args);<br> listeners.starting();<br><br> Collection exceptionReporters;<br> try {<br> // 初始化默认应用参数<br> ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);<br> // 根据监听器和默认的参数 来准备spring所需要的环境<br> ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);<br> this.configureIgnoreBeanInfo(environment);<br> // 打印出banner<br> Banner printedBanner = this.printBanner(environment);<br> // 创建应用上下文<br> context = this.createApplicationContext();<br> // 异常报告<br> exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);<br> // 准备应用上下文 <br> this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);<br> // 刷新上下文<br> this.refreshContext(context);<br> // 刷新<br> this.afterRefresh(context, applicationArguments);<br> stopWatch.stop();<br> if (this.logStartupInfo) {<br> (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);<br> }<br><br> listeners.started(context);<br> // 执行callRunners, 支持自定义run方法<br> this.callRunners(context, applicationArguments);<br> } <br>