Spring Boot自动配置和Dispatcher Servlet

在这一节中,我们将了解应用程序的背景功能:

什么是Dispatcher Servlet?

谁在配置Dispatcher Servlet?

Dispatcher Servlet做了什么?

HelloWorldBean对象是如何转换为JSON的?

谁在配置错误映射?

Dispatcher Servlet

在Spring MVC中,所有传入的请求都通过一个名为“Dispatcher Servlet(前端控制器)”的单个Servlet进行处理。前端控制器是Web应用程序开发中的一种设计模式。一个单独的Servlet接收所有请求并将它们传递给应用程序的其他所有组件。

DispatcherServlet的工作是接收传入的URI,并找到正确的组合,包括处理程序(Controller类)和视图(通常是JSP)。当DispatcherServlet确定视图时,它将其呈现为响应。最后,DispatcherServlet将响应对象返回给客户端。简而言之,Dispatcher Servlet起着关键作用。

另一个需要注意的是ErrorMvcAutoConfiguration:

  1. ErrorMvcAutoConfiguration匹配:

    • @ConditionalOnClass找到所需的类'javax.servlet.Servlet','org.springframework.web.servlet.DispatcherServlet'(OnClassCondition)
    • 找到'session'范围(OnWebApplicationCondition)

它配置了basicErrorControllererrorAttributesErrorMvcAutoConfigurationDefaultErrorViewResolverConfiguration。它创建了默认的错误页面,即“白标签错误页面”。

另一个自动配置的内容是HttpMessageConvertersAutoConfiguration。这些消息转换器自动进行消息转换。

  1. HttpMessageConvertersAutoConfiguration匹配:

    • @ConditionalOnClass找到所需的类'org.springframework.http.converter.HttpMessageConverter'(OnClassCondition)
    • ...

它初始化了Jackson Bean和消息转换器。Jackson2ObjectMapper执行从bean到JSONJSON到bean的转换。

Spring Boot自动配置

  • Spring Boot根据类路径中存在或不存在的依赖项(例如jar包、bean、属性等)自动配置Spring应用程序。
  • 它使开发变得更加简便和快速,因为无需定义包含在自动配置类中的某些bean。
  • 典型的基于MVC和数据库驱动的Spring MVC应用程序需要大量的配置,如dispatcher servlet、视图解析器、Jackson、数据源、事务管理器等等。

    • 如果类路径上存在Spring MVC jar,Spring Boot会自动配置Dispatcher Servlet
    • 如果类路径上存在Jackson jar,它会自动配置Jackson
    • 如果类路径上存在Hibernate jar,它会自动配置数据源
  • 可以通过在启动类中添加@SpringBootApplication@EnableAutoConfiguration注解来启用自动配置。这表明它是一个Spring上下文文件。
  • 它启用了名为自动配置的功能。
  • 它启用了名为组件扫描的功能。这是Spring的一个特性,它会自动开始扫描包和子包中的类,查找任何bean文件。
  • Spring Boot执行的一些自动配置示例:

    • DispatcherServletAutoConfiguration
    • DataSourceAutoConfiguration
    • JacksonAutoConfiguration
    • ErrorMvcAutoConfiguration(#basicErrorController)
  • 我们可以在AUTO-CONFIGURATION REPORTCONDITIONS EVALUATION REPORT中看到Spring Boot执行的自动配置。
  • 可以通过以下方式从自动配置中排除类:

    @SpringBootApplication (exclude={JacksonAutoConfiguration.class, JmxAutoConfiguration.class})

  1. 或在application.properties文件中添加以下语句:
spring.autoconfiguration.exclude=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration 

我们从自动配置中排除类,以实现应用程序的更快启动更好性能

  • 启用debug模式生成的AUTO-CONFIGURATION REPORT。打开application.properties文件并添加以下语句:
logging.level.org.springframework=debug  

运行RestfulWebServiceApplication.java文件。它会显示在CONDITIONS EVALUATION REPORT下的正匹配、负匹配、排除和无条件的类。

-----------------------------------------------  
CONDITIONS EVALUATION REPORT  
-----------------------------------------------  
Positive matches:  
----------------------  
ActiveMQAutoConfiguration matched:  
- @ConditionalOnClass found required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)  
- @ConditionalOnMissingBean (types: javax.jms.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)  
------------------  
------------------  
------------------  
Negative matches:  
-------------------------  
ActiveMQConnectionFactoryConfiguration.PooledConnectionFactoryConfiguration: Did not match:  
-@ConditionalOnClass did not find required classes 'org.messaginghub.pooled.jms.JmsPoolConnectionFactory','org.apache.commons.pool2.PooledObject' (OnClassCondition)  
----------------  
----------------  
----------------  
Exclusions:  
---------------  
None  
Unconditional classes:  
-----------------------------    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration  
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration  

报告中包含大量信息,无法显示所有细节。如果我们向下滚动报告并仔细查看自动配置日志,我们会发现DispatcherServletAutoConfiguration匹配

DispatcherServletAutoConfiguration matched:  
-@ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition)  
- found 'session' scope (OnWebApplicationCondition)  

这是因为spring-boot-starter-web依赖于spring-webmvc。因此,我们在类路径中获得了DispatcherServlet类。

Dispatcher Servlet

在Spring MVC中,所有传入的请求都经过一个名为Dispatcher Servlet(前端控制器)的单个Servlet。前端控制器是Web应用程序开发中的一种设计模式。一个单独的Servlet接收所有请求,并将它们传递给应用程序的所有其他组件。

spring-boot-auto-configure.png

DispatcherServlet的工作是接收传入的URI,并找到正确的组合,包括处理程序(Controller类)和视图(通常是JSP)。当DispatcherServlet确定视图时,它将其呈现为响应。最后,DispatcherServlet将响应对象返回给客户端。简而言之,Dispatcher Servlet起着关键作用。

另一个需要注意的是ErrorMvcAutoConfiguration:

ErrorMvcAutoConfiguration matched:  
-@ConditionalOnClass found required classes 'javax.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition)- found 'session' scope (OnWebApplicatiossssnCondition)  

它配置了basicErrorControllererrorAttributesErrorMvcAutoConfigurationDefaultErrorViewResolverConfiguration。它创建了默认的错误页面,即“白标签错误页面”。

spring-boot-auto-configure2.png

另一个自动配置的内容是HttpMessageConvertersAutoConfiguration。这些消息转换器自动进行消息转换。

HttpMessageConvertersAutoConfiguration matched:  
-@ConditionalOnClass found required class 'org.springframework.http.converter.HttpMessageConverter' (OnClassCondition)  
----------------  
-----------------  
JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration matched: - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder'(OnClassCondition)  

它初始化了Jackson Bean和消息转换器。Jackson2ObjectMapper执行从bean到JSONJSON到bean的转换。

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术