Spring IOC-Servlet加载到bean工厂

本文探讨了Spring的Servlet初始化过程中如何从Bean工厂获取或加载Bean。当Servlet开始初始化时,会查找配置文件,如xxx-servlet.xml,并支持使用传统XML标签或注解方式定义Bean。在configureAndRefreshWebApplicationContext方法中,WebApplicationContext被更新,涉及Bean的装配、加载和初始化等复杂流程。

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

Spring配置Servlet标签一文中介绍了Servlet的调用以及初始化过程,在一系列的初始化过程init中加载bean的模式都是先从bean工厂得到,如果没有那么就加载Spring属性文件DispatcherServlet.properties中默认的,那么在bean工厂中的bean是什么时候设置进工厂的,很简单,往下看。
先贴上继承关系图,好说话。
这里写图片描述
在FrameworkServlet类中有方法代码

protected final void initServletBean() throws ServletException {
    ………………
    protected final void initServletBean() throws ServletException {
    ………………
protected WebApplicationContext initWebApplicationContext() {
    // A context instance was injected at construction time -> use it
   //一个context在初始化的时候被注入                                            
   wac = this.webApplicationContext;  
   if (wac instanceof ConfigurableWebApplicationContext) {
   ………………
     configureAndRefreshWebApplicationContext(cwac);
   ………………
   ////等于空,加载配置文件然后刷新                                        
   if (wac == null) {                                        
    // No context instance is defined for this servlet -> 
    //就是说下面的代码是一定会初始化一个的,并且加载配置文件                         
    wac = createWebApplicationContext(rootContext); 
    ………………                                 

下面看createWebApplicationContext()中的代码。

………………
//用反射实例化一个                                                                           
ConfigurableWebApplicationContext wac =                                              
        (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);

wac.setParent(parent);                                                               
//重新设置配置文件路径,然后会刷新。在listener中其实已经设置一次了,那时候已经刷新路径了加载bean了                             
//相当于每次该配置都要重新启动工程                                                                   
wac.setConfigLocation(getContextConfigLocation());//参数配置的xml路径                       

configureAndRefreshWebApplicationContext(wac);                                       
………………

注意上面的代码wac.setConfigLocation(getContextConfigLocation());这回加载你的配置文件,一般都是类似xxx-servlet.xml的文件,在文件中你既可以用传统过的标签定义bean,也可以简单的声明几行代码告诉Spring用的是注解的方式
通过上面的代码,很自然的我们转到configureAndRefreshWebApplicationContext方法。关键代码如下:

wac.setServletContext(getServletContext());                                                
wac.setServletConfig(getServletConfig());                                                  
wac.setNamespace(getNamespace());                                                          
//添加监听器,org.springframework.context.event.SourceFilteringListener                          
wac.addApplicationListener(new SourceFilteringListener(wac, new ContextRefreshListener()));                                                                                          
postProcessWebApplicationContext(wac);                                                                                                                                                
applyInitializers(wac);                                                                                                                                                               
wac.refresh();                                                                             

好了,终于见到这行代码了wac.refresh();,为什么这么说那,因为这行代码就是WebApplicationContext的更新过程,这个更新过程的后台有一系列的复杂的但是很有调理的bean的装配、加载以及部分bean的初始化过程。
详细的介绍在《Spring IOC-WebApplicationContext刷新》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值