Spring 启动时context加载源码分析

1月 11, 2018 |

测试源码下载test-annotation.zip
有如下的代码

HelloWorldService.getHelloMessage方法简单的返回name的值, BootStrap.main方法中使用AnnotationConfigApplicationContext 构造一个上下文对象, 为了演示的方便, 显示的声明了DefaultListableBeanFactory和InstantiationStrategy实例。通过applicationContext.getBean()获取bean的引用,并调用 service.getHelloMessage() 方法。
上下文的加载主要发生在applicationContext.register方法和applicationContext.refresh方法中,
applicationContext.register方法的作用是为参数(使用@Configuration注解的class)生成BeanDefinition 对象并调用DefaultListableBeanFactory.registerBeanDefinition将BeanDefinition注册到DefaultListableBeanFactory中。
applicationContext.refresh()的功能要更多,主要功能一的是调用PostProcessor为@Configuration类中的@Bean标注的方法生成对应的BeanDefinition对象,并注册到DefaultListableBeanFactory中,
功能二是遍历DefaultListableBeanFactory中BeanDefinition, 产生真正的对象。

本文由javacoder.cn整理,转载注明出处

为@Configuration类中@Bean标注的方法生成BeanDefinition对象详细过程如下
步骤1、找到合适的BeanDefinitionRegistryPostProcessor处理器

步骤2、为@Configuration产生ConfigurationClass对象
//使用ConfigurationClassParser解析@Configuration标注的类,
//每一个@Configuration标注的类产生一个ConfigurationClass对象,
//ConfigurationClass.getBeanMethods()能获得该类中所有使用@Bean标注的方法,
//@Bean标注的方法使用BeanMethod对象表示

步骤3、@Bean标注的方法产生BeanDefinition并注入到DefaultListableBeanFactory中

此过程的调用栈:

根据BeanDefinition生成实例过程的调用栈:

Posted in: spring practise

Comments are closed.