1、使用方式-使用ApplicationContext方式加载XML
@Test
public void testBeanLoader(){
BeanFactory bf = new ClassPathXmlApplicationContext("configuration/spring-test.xml");
}
2、解析ClassPathXmlApplicationContext构造函数:
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);//设置配置文件信息
if (refresh) {
refresh();//主要的加载bean的过程
}
}
3、refresh方法:
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 准备刷新上下文环境
prepareRefresh();
// 初始化beanFactory并进行xml文件的读取
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//对beanfactory进行功能填充
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory); //允许beanfactory在上下环境中对子类的后处理
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory); //激活beanfactory
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory); //注册bean后处理,此时注册的并不是真正的bean,真正的bean是通过getBean得到的
// Initialize message source for this context.
initMessageSource(); //为上下文初始化message源
// Initialize event multicaster for this context.
initApplicationEventMulticaster(); //初始化应用消息广播器并注册到
ApplicationEventMulticaster中
// Initialize other special beans in specific context subclasses.
onRefresh(); //初始化其他上下文中子类中的特殊bean
// Check for listener beans and register them.
registerListeners(); //查找lestenerbean,并注册到消息广播器中
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory); //初始化单例
// Last step: publish corresponding event.
finishRefresh(); //初始化完成
}
catch (BeansException ex) {
logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);
// Destroy already created singletons to avoid dangling resources.
destroyBeans(); //异常时销毁bean
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}