spring tomcat启动 请求处理

onRefresh();
protected void onRefresh() { 
        try {
            createEmbeddedServletContainer();
        } 
    }
private void createEmbeddedServletContainer() {
        EmbeddedServletContainer localContainer = this.embeddedServletContainer;   //null
        ServletContext localServletContext = getServletContext();  //null
        if (localContainer == null && localServletContext == null) {
            EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();   //返回org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory 
            this.embeddedServletContainer = containerFactory
                    .getEmbeddedServletContainer(getSelfInitializer());  //this = AnnotationConfigEmbeddedWebApplicationContext,返回
        } 
        initPropertySources();
    }
protected EmbeddedServletContainerFactory getEmbeddedServletContainerFactory() { 
        String[] beanNames = getBeanFactory()
                .getBeanNamesForType(EmbeddedServletContainerFactory.class);   //[tomcatEmbeddedServletContainerFactory]
        return getBeanFactory().getBean(beanNames[0],EmbeddedServletContainerFactory.class);
    }
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
        return doGetBean(name, requiredType, null, false);//tomcatEmbeddedServletContainerFactory,interface org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
    } 
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {  
        try { 
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 
        } 

        Object beanInstance = doCreateBean(beanName, mbdToUse, args); 
        return beanInstance;
    }

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { 
        if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { 
            if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {  
                    bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); 
            } 
        }
        return bean;
    }
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);  //AnnotationAwareAspectJAutoProxyCreator判断要不要生成代理, 
            }
        }
        return null;
    }
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {  
        if (instanceWrapper == null) {
            instanceWrapper = createBeanInstance(beanName, mbd, args);  //org.springframework.beans.BeanWrapperImpl: wrapping object [org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory@7a7cc52c]  
        Object exposedObject = bean; 
            populateBean(beanName, mbd, instanceWrapper);
            if (exposedObject != null) {
                exposedObject = initializeBean(beanName, exposedObject, mbd);
            } 
        return exposedObject;
    }
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {  
        Object wrappedBean = bean; 
            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); 
            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); 
        return wrappedBean;
    }
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) { 
        Object result = existingBean;
        for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
            result = beanProcessor.postProcessAfterInitialization(result, beanName);
            if (result == null) {
                return result;
            }
        }
        return result;
    }
TomcatEmbeddedServletContainerFactory 类:
原来是通过server.xml解析的,这里是代码写死的。
public EmbeddedServletContainer getEmbeddedServletContainer(
            ServletContextInitializer... initializers) {
        Tomcat tomcat = new Tomcat();//org.apache.catalina.startup.Tomcat@620c8641
        File baseDir = (this.baseDirectory != null ? this.baseDirectory
                : createTempDir("tomcat"));//C:\Users\ADMINI~1\AppData\Local\Temp\tomcat.5396461944750847035.8086
        tomcat.setBaseDir(baseDir.getAbsolutePath());
        Connector connector = new Connector(this.protocol);
        tomcat.getService().addConnector(connector);
        customizeConnector(connector);
        tomcat.setConnector(connector);
        tomcat.getHost().setAutoDeploy(false);
        configureEngine(tomcat.getEngine());
        for (Connector additionalConnector : this.additionalTomcatConnectors) {
            tomcat.getService().addConnector(additionalConnector);
        }
        prepareContext(tomcat.getHost(), initializers);
        return getTomcatEmbeddedServletContainer(tomcat);
    }
 public Connector(String protocol) {
        setProtocol(protocol); 
        ProtocolHandler p = null;
        try {
            Class<?> clazz = Class.forName("org.apache.coyote.http11.Http11NioProtocol");
            p = (ProtocolHandler) clazz.getConstructor().newInstance();
        } finally {
            this.protocolHandler = p;
        } 
    }
public Server getServer() {
        if (server != null) {
            return server;
        }
        System.setProperty("catalina.useNaming", "false");
        server = new StandardServer();
        initBaseDir();
        server.setPort( -1 );
        Service service = new StandardService();
        service.setName("Tomcat");
        server.addService(service);
        return server;
    }
public Host getHost() {
        Engine engine = getEngine();
        if (engine.findChildren().length > 0) {
            return (Host) engine.findChildren()[0];
        }
        Host host = new StandardHost();
        host.setName(hostname);
        getEngine().addChild(host);
        return host;
    }
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
        return new TomcatEmbeddedServletContainer(tomcat, getPort() >= 0);
    }
public TomcatEmbeddedServletContainer(Tomcat tomcat, boolean autoStart) {
        Assert.notNull(tomcat, "Tomcat Server must not be null");
        this.tomcat = tomcat;
        this.autoStart = autoStart;
        initialize();
    }
private void initialize() throws EmbeddedServletContainerException { 
        synchronized (this.monitor) {
            try {
                addInstanceIdToEngineName();
                try {
                    final Context context = findContext(); 
                    this.tomcat.start(); 
            }
        }
    }
public void start() throws LifecycleException {
        getServer();
        getConnector();
        server.start();
    }
public final synchronized void start() throws LifecycleException {
        if (state.equals(LifecycleState.NEW)) {
            init();
        } else if (state.equals(LifecycleState.FAILED)) {
            stop();
        } else if (!state.equals(LifecycleState.INITIALIZED) &&
                !state.equals(LifecycleState.STOPPED)) {
            invalidTransition(Lifecycle.BEFORE_START_EVENT);
        }
        try {
            setStateInternal(LifecycleState.STARTING_PREP, null, false);
            startInternal();
            if (state.equals(LifecycleState.FAILED)) { 
                stop();
            } else if (!state.equals(LifecycleState.STARTING)) { 
                invalidTransition(Lifecycle.AFTER_START_EVENT);
            } else {
                setStateInternal(LifecycleState.STARTED, null, false);
            }
        }  
    }
public final synchronized void init() throws LifecycleException { 
        try { 
            initInternal(); 
        }  
    }
protected void initInternal() throws LifecycleException {
        for (int i = 0; i < services.length; i++) {
            services[i].init();
        }
    }
public final synchronized void init() throws LifecycleException { 
        try { 
            initInternal(); 
        }  
    }
protected void initInternal() throws LifecycleException { 
        if (engine != null) {
            engine.init();
        } 
        for (Executor executor : findExecutors()) {
            if (executor instanceof JmxEnabled) {
                ((JmxEnabled) executor).setDomain(getDomain());
            }
            executor.init();
        } 
        mapperListener.init();
        synchronized (connectorsLock) {
            for (Connector connector : connectors) {
                try {
                    connector.init();   //里面会adapter = new CoyoteAdapter(this);,
                }  
            }
        }
    }
解析requestMappingHandlerMapping是时候, 
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)  {
        Object result = existingBean;//requestMappingHandlerMapping
        for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
            result = beanProcessor.postProcessBeforeInitialization(result, beanName);//beanProcessor = ApplicationContextAwareProcessor, 
        }
        return result;
    }
ApplicationContextAwareProcessor类:
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException { 
        else {
            invokeAwareInterfaces(bean);
        }  
        return bean;
    }
protected void initInterceptors() {
        if (!this.interceptors.isEmpty()) {
            for (int i = 0; i < this.interceptors.size(); i++) {
                Object interceptor = this.interceptors.get(i); //[WebRequestHandlerInterceptorAdapter, ConversionServiceExposingInterceptor, ResourceUrlProviderExposingInterceptor]
                this.adaptedInterceptors.add(adaptInterceptor(interceptor));
            }
        }
    }
initializeBean方法里面的invokeInitMethods(beanName, wrappedBean, mbd);  把url跟controller的映射注册到requestMappingHandlerMapping进去了
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) {
            else {
                ((InitializingBean) bean).afterPropertiesSet();
            }
        }
        if (mbd != null) {
            String initMethodName = mbd.getInitMethodName();
            if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                    !mbd.isExternallyManagedInitMethod(initMethodName)) {
                invokeCustomInitMethod(beanName, bean, mbd);
            }
        }
    } 
requestMappingHandlerMapping类:
public void afterPropertiesSet() {   
        super.afterPropertiesSet();
    }
protected void initHandlerMethods() { 
        String[] beanNames =  getApplicationContext().getBeanNamesForType(Object.class));   //所有的bean
        for (String beanName : beanNames) {
            if (!beanName.startsWith(SCOPED_TARGET_NAME_PREFIX)) {
                Class<?> beanType = null;
                try {
                    beanType = getApplicationContext().getType(beanName);
                } 
                if (beanType != null && isHandler(beanType)) {
                    detectHandlerMethods(beanName);   //beanName = accountController
                }
            }
        }
        handlerMethodsInitialized(getHandlerMethods());
    }
protected boolean isHandler(Class<?> beanType) {
        return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
                AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
    }
protected void detectHandlerMethods(final Object handler) {
        Class<?> handlerType = (handler instanceof String ?
                getApplicationContext().getType((String) handler) : handler.getClass());   //class com.hcxy.car.controller.AccountController
        final Class<?> userType = ClassUtils.getUserClass(handlerType);   //class com.hcxy.car.controller.AccountController
        Map<Method, T> methods = MethodIntrospector.selectMethods(userType,
                new MethodIntrospector.MetadataLookup<T>() {
                    @Override
                    public T inspect(Method method) {
                        try {
                            return getMappingForMethod(method, userType);
                        } 
                    }
                });//{public Map  AccountController.addAccount(java.util.Map)  n={[/ota/account/add],methods=[POST]}, public  Map  AccountController.all1( )={[/ota/account/all],methods=[GET]}}
 
        for (Map.Entry<Method, T> entry : methods.entrySet()) {
            Method invocableMethod = AopUtils.selectInvocableMethod(entry.getKey(), userType);
            T mapping = entry.getValue();
            registerHandlerMethod(handler, invocableMethod, mapping);
        }
    }
请求进来。从tomcat走到DispatcherServlet。

DispatcherServlet类:

protected void onRefresh(ApplicationContext context) {
        initStrategies(context);
    }
protected void initStrategies(ApplicationContext context) {
        initMultipartResolver(context);
        initLocaleResolver(context);
        initThemeResolver(context);
        initHandlerMappings(context);
        initHandlerAdapters(context);
        initHandlerExceptionResolvers(context);
        initRequestToViewNameTranslator(context);//DefaultRequestToViewNameTranslator加到DispatcherServlet
        initViewResolvers(context);//DefaultRequestToViewNameTranslator加到DispatcherServlet
        initFlashMapManager(context);//DefaultRequestToViewNameTranslator加到DispatcherServlet
    }
private void initHandlerMappings(ApplicationContext context) {
        this.handlerMappings = null;   //this = DispatcherServlet
        if (this.detectAllHandlerMappings) {
            Map<String, HandlerMapping> matchingBeans =
                    BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);   //从容器找到所有的HandlerMapping,{requestMappingHandlerMapping=RequestMappingHandlerMapping@5ad6f98e, viewControllerHandlerMapping=WebMvcConfigurationSupport$EmptyHandlerMapping@786ff0ea, beanNameHandlerMapping=BeanNameUrlHandlerMapping@15186ce0, resourceHandlerMapping=SimpleUrlHandlerMapping@54bb1194, defaultServletHandlerMapping=WebMvcConfigurationSupport$EmptyHandlerMapping@1109730f, faviconHandlerMapping=SimpleUrlHandlerMapping@25109608, welcomePageHandlerMapping=WebMvcAutoConfiguration$WelcomePageHandlerMapping@38dbeb39}
            if (!matchingBeans.isEmpty()) {
                this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());   //7个,
                AnnotationAwareOrderComparator.sort(this.handlerMappings);
            }
        }
    }
private void initHandlerAdapters(ApplicationContext context) {
        this.handlerAdapters = null;  //this = DispatcherServlet
        if (this.detectAllHandlerAdapters) {
            Map<String, HandlerAdapter> matchingBeans =
                    BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false);   //从容器中找{requestMappingHandlerAdapter=RequestMappingHandlerAdapter@45297e7, httpRequestHandlerAdapter=HttpRequestHandlerAdapter@5423a17, simpleControllerHandlerAdapter=SimpleControllerHandlerAdapter@42ff9a77}
            if (!matchingBeans.isEmpty()) {
                this.handlerAdapters = new ArrayList<HandlerAdapter>(matchingBeans.values());
                AnnotationAwareOrderComparator.sort(this.handlerAdapters);
            }
        }
    }
private void initHandlerExceptionResolvers(ApplicationContext context) {
        this.handlerExceptionResolvers = null;    //this = DispatcherServlet
        if (this.detectAllHandlerExceptionResolvers) {
            Map<String, HandlerExceptionResolver> matchingBeans = BeanFactoryUtils
                    .beansOfTypeIncludingAncestors(context, HandlerExceptionResolver.class, true, false);  //{errorAttributes=DefaultErrorAttributes@30cafd13, handlerExceptionResolver=HandlerExceptionResolverComposite@60f662bd}
            if (!matchingBeans.isEmpty()) {
                this.handlerExceptionResolvers = new ArrayList<HandlerExceptionResolver>(matchingBeans.values());
                AnnotationAwareOrderComparator.sort(this.handlerExceptionResolvers);
            }
        }
private void initViewResolvers(ApplicationContext context) {
        this.viewResolvers = null;//this = DispatcherServlet
        if (this.detectAllViewResolvers) {
            // Find all ViewResolvers in the ApplicationContext, including ancestor contexts.
            Map<String, ViewResolver> matchingBeans =
                    BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
            if (!matchingBeans.isEmpty()) {
                this.viewResolvers = new ArrayList<ViewResolver>(matchingBeans.values());
                //[org.springframework.web.servlet.view.BeanNameViewResolver@29090809, org.springframework.web.servlet.view.ViewResolverComposite@22aee519, org.springframework.web.servlet.view.InternalResourceViewResolver@7ba06506, org.springframework.web.servlet.view.ContentNegotiatingViewResolver@3e2c4d4b, org.thymeleaf.spring4.view.ThymeleafViewResolver@780129bc]
                AnnotationAwareOrderComparator.sort(this.viewResolvers);
            }
        }
private void initFlashMapManager(ApplicationContext context) {
        try {//this = DispatcherServlet
            this.flashMapManager = context.getBean(FLASH_MAP_MANAGER_BEAN_NAME, FlashMapManager.class); //SessionFlashMapManager
        }
请求进来,然后进到doService方法。
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            doDispatch(request, response);
        } 
    }
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { 
HandlerExecutionChain mappedHandler = null;    //拦截器链
        try { 
            try {
                processedRequest = checkMultipart(request);   //上床文件,
                multipartRequestParsed = (processedRequest != request); 
                mappedHandler = getHandler(processedRequest); //public java.util.Map  com.hcxy.car.controller.AccountController.all1()
                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());  // ha = RequestMappingHandlerAdapter 
                if (!mappedHandler.applyPreHandle(processedRequest, response)) {  //前置拦截器
                    return;
                }
    //反射调用controller的方法。
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    
    applyDefaultViewName(processedRequest, mv);
                mappedHandler.applyPostHandle(processedRequest, response, mv);   //后置拦截器
            } 
        } 
    }
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
        for (HandlerMapping hm : this.handlerMappings) {//[SimpleUrlHandlerMapping@7afbf2a0, RequestMappingHandlerMapping@349f0ca4, BeanNameUrlHandlerMapping@52ca0ad4, SimpleUrlHandlerMapping@2565a7d0, WebMvcConfigurationSupport$EmptyHandlerMapping@47f2c722, WebMvcConfigurationSupport$EmptyHandlerMapping@4fd7b79, WebMvcAutoConfiguration$WelcomePageHandlerMapping@7e050be1],只有RequestMappingHandlerMapping有url和controller的对应关系。
            HandlerExecutionChain handler = hm.getHandler(request);  //hm= RequestMappingHandlerMapping
            if (handler != null) {
                return handler;//public java.util.Map com.hcxy.car.controller.AccountController.all1()
            }
        }
        return null;
    }
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
        for (HandlerAdapter ha : this.handlerAdapters) { //[RequestMappingHandlerAdapter@6e2eead5, HttpRequestHandlerAdapter@113eed88, SimpleControllerHandlerAdapter@5f0677f3]
            if (ha.supports(handler)) {
                return ha;//RequestMappingHandlerAdapter
            }
        } 
    }
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HandlerInterceptor[] interceptors = getInterceptors();//拦截器
        if (!ObjectUtils.isEmpty(interceptors)) {
            for (int i = 0; i < interceptors.length; i++) {
                HandlerInterceptor interceptor = interceptors[i];
                if (!interceptor.preHandle(request, response, this.handler)) { 
                }
                this.interceptorIndex = i;
            }
        }
        return true;
    }
反射调用controller的方法。
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());   //ha = RequestMappingHandlerAdapter
protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { 
        else {
            mav = invokeHandlerMethod(request, response, handlerMethod);
        } 
        return mav;
    }
protected <T> void writeWithMessageConverters(T value, MethodParameter returnType,
            ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage)  {
        if (selectedMediaType != null) {
            selectedMediaType = selectedMediaType.removeQualityValue();
            for (HttpMessageConverter<?> messageConverter : this.messageConverters) {
                if (messageConverter instanceof GenericHttpMessageConverter) {
                    if (((GenericHttpMessageConverter) messageConverter).canWrite(
                            declaredType, valueType, selectedMediaType)) {
                        outputValue = (T) getAdvice().beforeBodyWrite(outputValue, returnType, selectedMediaType,
                                (Class<? extends HttpMessageConverter<?>>) messageConverter.getClass(),
                                inputMessage, outputMessage);   //{@11105} accounts -> {@11106} 12345,返回的Map。
                        if (outputValue != null) {
                            addContentDispositionHeader(inputMessage, outputMessage);
                            ((GenericHttpMessageConverter) messageConverter).write(
                                    outputValue, declaredType, selectedMediaType, outputMessage); 
                        }
                        return;
                    }
                } 
            }
        } 
    }
objectWriter.writeValue(generator, value);   //写出去数据给流浪器,从response写出去。
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);     //视图响应

if (mv != null && !mv.wasCleared()) {//
            render(mv, request, response);   //渲染
            if (errorView) {
                WebUtils.clearErrorRequestAttributes(request);
            }
        }
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { 

        View view;
        if (mv.isReference()) { 
            view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request); 
            }
        }
        else { 
            view = mv.getView(); 
        }
 
        try {
            if (mv.getStatus() != null) {
                response.setStatus(mv.getStatus().value());
            }
            view.render(mv.getModelInternal(), request, response);
        } 
    }
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
            HttpServletRequest request) throws Exception {

        for (ViewResolver viewResolver : this.viewResolvers) {   //viewResolvers是视图解析器
            View view = viewResolver.resolveViewName(viewName, locale);
            if (view != null) {
                return view;
            }
        }
        return null;
    }
public View resolveViewName(String viewName, Locale locale) throws Exception {
        if (!isCache()) {
            return createView(viewName, locale);
        }

猜你喜欢

转载自www.cnblogs.com/yaowen/p/11881385.html