以实现了ApplicationContext接口的AnnotationConfigApplicationContext
的初始化流程为例
// 有多个构造方法,此构造方法是传入一个配置类
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
// 1.调用自己的无参构造,此时会先去调用父类的无参构造,初始化内部的BeanFactory
// 之后创建AnnotatedBeanDefinitionReader对象用于处理@Bean注解,
// 又创建ClassPathBeanDefinitionScanner对象,用于扫描类路径上的Bean
this();
// 2.注册刚才传入的配置类
this.register(componentClasses);
// 3.关键部分,用于创建所有的bean实例
this.refresh();
}
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh();
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
// 初始化Bean工厂,如一些会用到的类加载器和后置处理器
this.prepareBeanFactory(beanFactory);
try {
this.postProcessBeanFactory(beanFactory);
// 实例化并调用所有注册的 BeanFactoryPostProcessor 类型的Bean
// 这一步中,会调用那些包扫描、Bean解析就开始工作了
// 这步过后,就将包扫描到的Bean注册到BeanFactory中了
this.invokeBeanFactoryPostProcessors(beanFactory);
// 实例化并注册所有BeanFactoryPostProcessor 类型的Bean,但并不急着执行
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
// 检查监听Bean并将这些监听Bean向容器注册
this.registerListeners();
// 实例化所有的非懒加载的bean - 核心加载位置
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
// 完成上述操作后IOC容器也就到了一个基本可用的状态了
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
//跳转到加载bean的方法,核心位置如下
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
…………
beanFactory.preInstantiateSingletons();
}
//跟进后是一个接口,查看其实现子类,找到具体的实现方法
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
void preInstantiateSingletons() throws BeansException;
}
//核心实现代码
public void preInstantiateSingletons() throws BeansException {
// 列出所有的beanName
List<String> beanNames = new ArrayList(this.beanDefinitionNames);
Iterator var2 = beanNames.iterator();
// 开始初始化所有的bean
while(true) {
String beanName;
Object bean;
do {
while(true) {
RootBeanDefinition bd;
do {
do {
do {
…………
beanName = (String)var2.next();
// 获取bean的定义,但此时bean不能是抽象,不能是原型也不能是懒加载,不然直接看下一个bean
bd = this.getMergedLocalBeanDefinition(beanName);
} while(bd.isAbstract()); // 不能为抽象
} while(!bd.isSingleton());// 不能为原型
} while(bd.isLazyInit());// 不能为懒加载
// 判断是否为工厂bean
if (this.isFactoryBean(beanName)) {
bean = this.getBean("&" + beanName);
break;
}
// 如果不是工厂bean就直接调用getBean方法去获取bean
this.getBean(beanName);
} while(!(bean instanceof FactoryBean));
FactoryBean<?> factory = (FactoryBean)bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
SmartFactoryBean var10000 = (SmartFactoryBean)factory;
((SmartFactoryBean)factory).getClass();
isEagerInit = (Boolean)AccessController.doPrivileged(var10000::isEagerInit, this.getAccessControlContext());
} else {
isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean)factory).isEagerInit();
}
if (isEagerInit) {
this.getBean(beanName);
}
}
}