本文共 2947 字,大约阅读时间需要 9 分钟。
1.当创建一个上下文:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
2.进入ClassPathXmlApplicationContext.java
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent);//2-1 setConfigLocations(configLocations);//2-2 if (refresh) { refresh();//2-3 } }
2-1 :解析super(parent)
主要功能是获取 ResourcePatternResolver
经过层层调用,在AbstractApplicationContext.java中:
this.resourcePatternResolver = getResourcePatternResolver();
getResourcePatternResolver经过查看为:
new PathMatchingResourcePatternResolver(this);
结论:主要作用是设置applicationContext对象的resourcePatternResolver 属性为new PathMatchingResourcePatternResolver(this)
2-2 :setConfigLocations(configLocations)
替换配置文件名称中的占位符
2-3 :见下一节 refresh()详解
二。refresh()详解
进入AbstractApplicationContext # refresh()
synchronized (this.startupShutdownMonitor) { // 1 prepareRefresh(); // 2 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 3 prepareBeanFactory(beanFactory); try { // 4 postProcessBeanFactory(beanFactory); // 5 invokeBeanFactoryPostProcessors(beanFactory); // 6 registerBeanPostProcessors(beanFactory); // 7 initMessageSource(); // 8 initApplicationEventMulticaster(); // 9 onRefresh(); // 10 registerListeners(); // 11 finishBeanFactoryInitialization(beanFactory); // 12 finishRefresh(); } catch (BeansException ex) { logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex); // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } }1、prepareRefresh()
进入此方法,可以看到两个比较重要的步骤
initPropertySources(); //初始化属性源,比如从properties文件中读取,从url读取....这个方法一般交给子类实现
getEnvironment().validateRequiredProperties(); //验证资源中的占位符是否在必要的属性源中都存在,若不存在则抛出异 常MissingRequiredPropertiesException
2.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
进入方法 ,比较重要的一段为↓
refreshBeanFactory(); //*****初始化beanDefinitionMap---->加载xml中的<bean>为beanDefinition
此时可以 看到alreadyCreated属性数量小于beanDefinitionMap长度
3.prepareBeanFactory(beanFactory);
初始化这个上下文中beanFactory的一些特性
4.postProcessBeanFactory(beanFactory);
对这个beanFactory进行后处理,由子类实现
5.invokeBeanFactoryPostProcessors(beanFactory);
调用beanFactory的处理器(如果有的话)
BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理
注解处理器:可以载入beanDefinitionMap()
SpringBoot中:读取属性处理器:读取property文件到Enviroment中
SpringBoot中:
6.registerBeanPostProcessors(beanFactory);
如果BeanPostProcessors接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调
7.initMessageSource(); 国际化使用
8.initApplicationEventMulticaster(); //初始化上下文 监听广播器
9.onRefresh();
//初始化一些特殊的bean
10.registerListeners();
11 finishBeanFactoryInitialization(beanFactory);//初始化其他的bean
可以查看alreadyCreated 12 finishRefresh();转载地址:http://fihgi.baihongyu.com/