Spring IOC 源码-ClassPathXmlApplicationContext-bean解析

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();
            }
        }
    }

猜你喜欢

转载自xiaoxiaoxuanao.iteye.com/blog/2315529