博文目录
IoC容器加载流程可以分成两个步骤
// 常见的写法, 其实AnnotationConfigApplicationContext还有一个传入basePackages的构造函数
// 如果传入的是包路径, 则通过BeanDefinitionScanner扫描, 找到候选组件将其封装成为BeanDefinition, 注册到容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Object bean = context.getBean("demo");
System.out.println(bean);
初始化 AnnotationConfigApplicationContext 的时候, 会预先注册几个底层基础架构工具类, 他们以后置处理器的形式被注册, 在容器初始化流程中发光发热. 然后再注册配置类, 然后才是刷新容器
这些工具类中有两个非常重要
调用 refresh 的 invokeBeanFactoryPostProcessors 方法, 将自动或手动注册的各种 BeanFactoryPostProcessors (包括 BeanDefinitionRegistryPostProcessor) 按一定的顺序规则逐个调用其 postProcessBeanDefinitionRegistry 和 postProcessBeanFactory 方法
这里其实主要就是工具类 ConfigurationClassPostProcessor 在发光发热, 它解析到目前为止容器中所有 BeanDefinition 中的配置类, 将相关的组件候选全都注册成为 BeanDefinition
调用 refresh 的 finishBeanFactoryInitialization 方法, 遍历 beanNames, 拿到对应 beanName 的 BeanDefinition, 符合生产条件(非抽象&是单例&非懒加载)的都调用 getBean(beanName) 来生产 Bean, 并缓存到一级缓存(单例池)中
Bean 的创建可以分为三个步骤
生产完成之后, 将该 Bean 缓存到一级缓存(单例池)中
BeanFactory 的实现应该尽可能支持标准 Bean 生命周期接口. 全套初始化方法及其标准顺序如下
BeanNameAware, BeanClassLoaderAware, BeanFactoryAware 是在 Bean 初始化方法 initializeBean 里面调用的
EnvironmentAware, EmbeddedValueResolverAware, ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware, ApplicationContextAware 是在 ApplicationContextAwareProcessor 这个 BeanPostProcessor 里面的 postProcessBeforeInitiolization 方法调用的
// 在 BeanPostProcessors 的 postProcessBeforeInitialization 中, InitDestroyAnnotationBeanPostProcessor会处理 @PostConstruct 注解, 会调用被该注解标注的方法, CommonAnnotationBeanPostProcessor 是 reader 注册的创世纪处理器之一
class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor
到这一步, bean已经生产好了, 它们将一直驻留在 ApplicatonContext 中, 直到该 ApplicatonContext 被销毁
在关闭 BeanFactory 时, 以下生命周期方法适用