您的位置:首页 > 编程语言 > Java开发

Spring -- 源码分析 -- ClassPathXmlApplicationContext

2019-06-18 15:50 309 查看

1、基本情况

1、该类定义了资源文件数组,也就是需要解析的 xml 文件集合,使用的是 spring 独立封装的 resource 类,该类提供了多种读取资源的方式;然后调用 refresh 方法,进行容器的初始化

[code]setConfigLocations(configLocations);
if (refresh) {
refresh();
}

2、resource 读取

[code]ClassPathResource resource = new ClassPathResource("test.txt");
System.out.println("exists: "+resource.exists());
System.out.println("desc: "+resource.getDescription());
System.out.println("path: "+resource.getPath());

BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
System.out.println(reader.readLine());

3、refresh 过程

[code]//1.提供添加属性的重写方法, 并进行 environment 属性校验
prepareRefresh();

//2.使用 DefaultListableBeanFactory 进行 bean 的加载, 读取解析 xml 资源
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

//3.设置需要装配、不需要装配的接口,以及注册一些必要的 Bean
prepareBeanFactory(beanFactory);

//4.空实现, 供子类实现
postProcessBeanFactory(beanFactory);

//5.调用 BeanFactoryPostProcessor, 这里可以对 BeanFactory 进行定制修改
invokeBeanFactoryPostProcessors(beanFactory);

//6.将 BeanFactory 中所有的 BeanPostProcessors 注册进来
registerBeanPostProcessors(beanFactory);

//7.国际化配置, messageSource
initMessageSource();

//8.配置事件发布代理器
initApplicationEventMulticaster();

//9.空实现, 供子类实现
onRefresh();

//10.将所有的事件监听器, 加入到事件发布代理器中
registerListeners();

//11.提前初始化所有bean
finishBeanFactoryInitialization(beanFactory);

//12.初始化生命周期 lifecycleProcessor, 发布容器初始化完毕事件
finishRefresh();

4、步骤1:prepareRefresh

[code]this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);

//提供给子类重写, 用来加入需要进行验证的属性
initPropertySources();
getEnvironment().validateRequiredProperties();

5、步骤2:obtainFreshBeanFactory

[code]//容器初始化
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
return beanFactory;
[code]//AbstractRefreshableApplicationContext.java    120行
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
//1.创建的是 DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
//2.加载bean
loadBeanDefinitions(beanFactory);

6、步骤3:prepareBeanFactory

[code]beanFactory.setBeanClassLoader(getClassLoader());
//1.设置 bean 解析器
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));

//2.
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

//3.在 bean 初始化之前, 注入 ApplicationContext 对象
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

//4.忽略装配的bean:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);

//5.设置需要的依赖:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);

//6.注入environment、systemProperties、systemEnvironment
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}

7、步骤4:postProcessBeanFactory,空实现,供子类实现

8、步骤5:invokeBeanFactoryPostProcessors

 

[code]//PostProcessorRegistrationDelegate.java    52行
//注册 BeanFactoryPostProcessor,分为 regular 和 registry 集合
//也就是 BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor
//registry 类型的先执行 postProcessBeanDefinitionRegistry 方法
if (beanFactory instanceof BeanDefinitionRegistry) {
for(...){
//1.自定义 BeanFactoryPostProcessor 分类
}

//2.查询所有 BeanDefinitionRegistryPostProcessor 类型的
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

//3,4,5步骤中,先执行 postProcessBeanDefinitionRegistry 方法
for(...){
//3.筛选出 PriorityOrdered 类型,排序之后加入到 registry 集合中
}

for(...){
//4.筛选出 Ordered 类型,排序之后加入到 registry 集合中
}

for(...){
//5.筛选出 普通 类型,加入到 registry 集合中
}

//6.执行 registry 类型的 postProcessBeanFactory 方法
invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
//7.执行 regular 类型的 postProcessBeanFactory 方法
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

}

9、步骤6:registerBeanPostProcessors

[code]//PostProcessorRegistrationDelegate.java    183行
//1.查找所有的 BeanPostProcessor 类型的bean
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

//2.按照 PriorityOrdered、Ordered、普通进行分类,排序
for(...){
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {

}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {

}else {

}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: