📜  Spring Boot自动配置和分派器Servlet

📅  最后修改于: 2021-01-11 05:46:45             🧑  作者: Mango

Spring Boot自动配置和分派器Servlet

在本节中,我们将看到应用程序的后台功能:

什么是调度程序servlet?

谁在配置调度程序servlet?

调度程序servlet做什么?

HelloWorldBean对象如何转换为JSON?

谁在配置错误映射?

Spring Boot自动配置

  • Spring Boot根据在类路径中存在或不存在的依赖项(如jar,bean,属性等)自动配置spring应用程序。
  • 由于无需定义自动配置类中包含的某些Bean,因此它使开发更加轻松和快捷。
  • 典型的MVC数据库驱动的Spring MVC应用程序需要大量配置,例如调度程序servlet,视图解析器,Jackson,数据源,事务管理器等。
    • 如果Spring MVC jar位于类路径中,则Spring Boot会自动配置Dispatcher Servlet。
    • 如果Jackson罐位于类路径中,则自动配置Jackson。
    • 如果Hibernate jar在类路径中,则自动配置数据源。
  • 可以通过在启动类中添加@SpringBootApplication@EnableAutoConfiguration注释来启用自动配置。它指示它是一个Spring上下文文件。
  • 它启用了称为自动配置的功能
  • 它启用了称为组件扫描的功能。这是Spring的功能,它将开始自动扫描软件包和子软件包中的类以查找任何bean文件。
  • Spring Boot完成了一些自动配置的示例:
    • DispatcherServletAutoConfiguration
    • 数据源自动配置
    • 杰克逊自动配置
    • ErrorMvcAutoConfiguration (#basicErrorController)
  • 我们可以在AUTO-CONFIGURATION REPORTCONDITIONS EVALUATION REPORT中看到Spring Boot完成的自动配置。
  • 通过添加以下内容,可以从自动配置中排除类:
@SpringBootApplication (exclude={JacksonAutoConfiguration.class, JmxAutoConfiguration.class})

或在application.properties文件中添加以下语句。

spring.autoconfiguration.exclude=org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration

我们从自动配置中排除了类,以加快启动速度提高应用程序性能。

  • 通过启用调试模式生成的自动配置报告。打开application.properties文件,并添加以下语句:
logging.level.org.springframework=debug

运行RestfulWebServiceApplication.java文件。它显示了条件评估报告下的肯定匹配,否定匹配,排除和无条件类。

-----------------------------------------------
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类。

分派器Servlet

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

DispatcherServlet的工作是获取传入的URI,并找到处理程序(控制器类)和视图(通常是JSP)的正确组合。当DispatcherServlet确定视图时,它将其呈现为响应。最后,DispatcherServlet将响应对象返回给客户端。简而言之,分派器Servlet扮演着关键角色。

要注意的另一件事是ErrorMvcAutoConfiguration:

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

它配置basicErrorController,errorAttributes,ErrorMvcAutoConfigurationDefaultErrorViewResolverConfiguration 。它创建默认的错误页面,称为Whitelabel Error Page

另一件事是自动配置的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到JSON从JSON到bean的转换。