文章目录
上一部分中实现了可以通过XmlResourceLoader读取配置信息注册到beanFactory,但是为了方便用户使用再进行一层封装,也就是封装一个context上下文,它不仅可以帮我们初始化beanFactory,加载beanDefinition,还可以做一些功能的增强,例如spring中最重要的BeanFactoryPostProcessor和BeanPostProcessor.
目的就是为了
ConfigurableApplicationContext 接口
ConfigurableApplicationContext -> ApplicationContext -> ListableBeanFactory -> BeanFactory
定义了核心的refresh方法
public interface ConfigurableApplicationContext extends ApplicationContext{
void refresh() throws BeansException;
}
AbstractApplicationContext 具体实现接口的抽象类 (1层)
用于编排整体的方法
public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
@Override
public void refresh() throws BeansException {
// 1. 创建beanFactory并加载beanDefinition.
refreshBeanFactory();
// 2. 获取BeanFactory
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 3. 在 Bean 实例化之前,执行 BeanFactoryPostProcessor
invokeBeanFactoryPostProcessors(beanFactory);
// 4. BeanPostProcessor 需要提前于其他 Bean 对象实例化之前执行注册操作
registerBeanPostProcessors(beanFactory);
// 5. 提前实例化单例Bean对象
beanFactory.preInstantiateSingletons();
}
private void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
Map<String, BeanFactoryPostProcessor> beanFactoryPostProcessorMap = beanFactory.getBeansOfType(BeanFactoryPostProcessor.class);
for (BeanFactoryPostProcessor beanFactoryPostProcessor : beanFactoryPostProcessorMap.values()) {
beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
}
}
private void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
Map