Spring IOC-WebApplicationContext刷新(was.refresh())

本文探讨Spring框架中WebApplicationContext的刷新过程,主要关注`refresh()`方法的执行路径。在`ContextLoader`和`FrameworkServlet`中调用此方法,触发AbstractApplicationContext的`refresh()`,完成bean的重新加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring配置web.xml中标签(ContextLoaderListener类解析)解析一文的最后我们留下了wac.refresh();是怎样执行的问题。
【在ContextLoader类中和FrameworkServlet中都执行了这行代码】
不管是在哪里调用refresh(),执行的都是AbstractApplicationContext的refresh()方法,这里再贴出相应的代码:

public void refresh() throws BeansException, IllegalStateException {          
    synchronized (this.startupShutdownMonitor) {                              
        // Prepare this context for refreshing.                               
        prepareRefresh();                                                     
        //会调用XmlWebApplicationContext.loadBeanDefinitions()方法                 
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()
        // 准备bean工厂                                                           
        prepareBeanFactory(beanFactory);                                      
        try {                                                                 
            // Allows post-processing of the bean factory in context subclasse
            postProcessBeanFactory(beanFactory);                               
            //对beanFactory对象本身调用在此环境中注册的processors                            
            invokeBeanFactoryPostProcessors(beanFactory);                         
            //注册所有的对bean的processors                                           
            registerBeanPostProcessors(beanFactory);                          
            // Initialize message source for this context.                    
            //初始化国际化支持的bean                                                   
            initMessageSource();                                                          
            //初始化时间发布器                                                        
            initApplicationEventMulticaster();                                 
            //刷新之后执行的操作                                                       
            onRefresh();                                                                          
            //注册事件,从bean工厂得到或者这个类设置进来的                                        
            registerListeners();                                                       
            //实例化所有单例的bean                                                    
            finishBeanFactoryInitialization(beanFactory);                     
            // Last step: publish corresponding event.                        
            finishRefresh();                                                  
        }                                                                                                                                       
        catch (BeansException ex) {                                           
            // Destroy already created singletons to avoid dangling resources.
            destroyBeans();                                                   
            // Reset 'active' flag.                                           
            cancelRefresh(ex);                                                
            // Propagate exception to caller.                                 
            throw ex;                                                         
        }                                                                     
    }                                                                         
}                   

可以看到一系列的初始化,这样Context就完成了刷新(重新加载所有的定义的bean)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值