ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")代码调试收获
1.通过super(parent)调用了父类AbstractApplicationContext的构造方法,使AbstractApplicationContext中
ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver;引发学习http://cainiaoboke.iteye.com/blog/2327685
2.setConfigLocations(configLocations)调用父类AbstractRefreshableConfigApplicationContext的setConfigLocations方法,使中的private String[] configLocations=[Beans.xml]
3.重点refresh开始调用AbstractApplicationContext的refresh()方法
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 容器启动的预先准备,记录容器启动的时间和标记
prepareRefresh();
// 创建BeanFactory,如果已有就销毁,没有就创建。此类实现了对BeanDefinition的装载
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 配置BeanFactory标准上下文特性,如类装载器,PostProcesser等
prepareBeanFactory(beanFactory);
try {
// 在bean被装载后,提供一个修改BeanFactory的入口
postProcessBeanFactory(beanFactory);
// 调用postProcessBeanFactory
invokeBeanFactoryPostProcessors(beanFactory);
// 注册用于拦截bean创建过程中的BeanPostProcessors
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// 注册监听器
registerListeners();
// 完成容器的初始化,里面的preInstantiateSingletons()完成对单例对象的创建
finishBeanFactoryInitialization(beanFactory);