spring mvc源码

初始化tomcat会读取web.xml,从里面获取servlet class得到DispatcherServlet,父类是HttpServlet,有doget,dopost,传入request,传出response。tomcat在开始的时候会调用HttpServlet的init方法,子类重写这个方法。FrameworkServlet继承HttpServlet,增加WebApplicationContext。DispatcherServlet继承FrameworkServlet,增加HandlerMap
摘要由CSDN通过智能技术生成

初始化

tomcat会读取web.xml,从里面获取servlet class得到DispatcherServlet,父类是HttpServlet,有doget,dopost,传入request,传出response。
tomcat在开始的时候会调用HttpServlet的init方法,子类重写这个方法。FrameworkServlet继承HttpServlet,增加WebApplicationContext。
DispatcherServlet继承FrameworkServlet,增加HandlerMapping和handlerAdapters。
最开始首先创建WebApplicationContext。

    public void refresh() throws BeansException, IllegalStateException {
   
        synchronized (this.startupShutdownMonitor) {
   


            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            prepareBeanFactory(beanFactory);


            // Register bean processors that intercept bean creation.
            registerBeanPostProcessors(beanFactory);

            finishBeanFactoryInitialization(beanFactory);
        }
    }

在obtainFreshBeanFactory的loadBeanDefinitions,会调用getDefaultConfigLocation,Namespace就是xml配置的servlet-name,读取的就是dispatcher-servlet.xml。

    protected String getDefaultConfigLocation() {
   
        if (getNamespace() != null) {
   
            return DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX;
        }
        else {
   
            return DEFAULT_CONFIG_LOCATION;
        }
    }

这里对beanfactory进行BeanDefinition注册。

	    else if(namespaceUri.equals("http://www.springframework.org/schema/context")&& ele.getLocalName().equals("component-scan")){
   
            //找出需要搜索的包,并注册controller
            NamespaceHandler namespaceHandler=this.namespaceHandlers.get(namespaceUri);
            namespaceHandler.parse(ele,this.registry);
        }
        else if(namespaceUri.equals("http://www.springframework.org/schema/mvc") && ele.getLocalName().equals("annotation-driven")){
   
            BeanDefinition handlerMappingDef = null;
            try {
   
                handlerMappingDef = new BeanDefinition(HANDLER_MAPPING_BEAN_NAME);
            } catch (ClassNotFoundException e) {
   
                e.printStackTrace();
            }
            this.registry.registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME , handlerMappingDef);

            BeanDefinition handlerAdapterDef = null;
            try {
   
                handlerAdapterDef = new BeanDefinition(HANDLER_ADAPTER_BEAN_NAME);
            } catch (ClassNotFoundException e) {
   
                e.printStackTrace();
            }
            this.registry.registerBeanDefinition(HANDLER_ADAPTER_BEAN_NAME , handlerAdapterDef);

        }

module不能循环依赖,怎么互相使用对方的类呢?

通过反射

NamespaceHandlerSupport

这个类提供了基本的解析功能,由子类实现init方法来注册parser。

context:component-scan

扫描对应的包,读取类信息,注册beandefinition

    public Set<BeanDefinitionHolder> doScan(String... basePackages) {
   
        Set<BeanDefinitionHolder> beanDefinitions = new 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值