从AnnotationConfigApplicationContext开始看springIOC源码
下面是一个简单的spring的代码
@Configuration
public class SpringConfig {
@Bean
public Bean1 bean(){
return new Bean1();
}
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(SpringConfig.class);
Bean1 bean1 = applicationContext.getBean(Bean1.class);
bean1.getStr();
}
}
进入new AnnotationConfigApplicationContext(SpringConfig.class)这行代码中可以看到这个构造函数有三行代码,而最关键的就是refresh();这个方法。
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
register(componentClasses);
refresh();
}
进入refresh()方法,这个方法主要做了以下几件事情
- 创建beanFactory并初始化:spring IOC 源码阅读(二)之创建beanFactory及初始化
- 执行BeanFactoryPostProcessors接口的的方法:spring IOC 源码阅读(三)之invokeBeanFactoryPostProcessors(beanFactory)
- 向spring容器中注册beanPostProcessor:spring IOC 源码阅读(四)之registerBeanPostProcessors(beanFactory)
- 初始化事件传播器:spring IOC 源码阅读(五)之初始化传播器
- 将所有ApplicationListener注册到事件传播器中
- 创建剩下的单实例的bean:spring IOC 源码阅读(六)之单实例bean的创建
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
//创建beanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//BeanFactory的预准备工作
prepareBeanFactory(beanFactory);
try {
//给子类实现的本身并没有逻辑代码
postProcessBeanFactory(beanFactory);
// 执行BeanFactoryPostProcessors接口的的方法
invokeBeanFactoryPostProcessors(beanFactory);
// 向spring容器中注册beanPostProcessor
registerBeanPostProcessors(beanFactory);
//初始化MessageSource组件
initMessageSource();
// 初始化事件传播器
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// 将所有ApplicationListener注册到时间传播器中
registerListeners();
// 创建剩下的单实例的bean.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
......
}
finally {
......
}
}
}