Spring boot教程-Spring Boot自动配置与Dispatcher Servlet
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:
ErrorMvcAutoConfiguration匹配:
- @ConditionalOnClass找到所需的类'javax.servlet.Servlet','org.springframework.web.servlet.DispatcherServlet'(OnClassCondition)
- 找到'session'范围(OnWebApplicationCondition)
它配置了basicErrorController、errorAttributes、ErrorMvcAutoConfiguration和DefaultErrorViewResolverConfiguration。它创建了默认的错误页面,即“白标签错误页面”。
另一个自动配置的内容是HttpMessageConvertersAutoConfiguration。这些消息转换器自动进行消息转换。
HttpMessageConvertersAutoConfiguration匹配:
- @ConditionalOnClass找到所需的类'org.springframework.http.converter.HttpMessageConverter'(OnClassCondition)
- ...
它初始化了Jackson Bean和消息转换器。Jackson2ObjectMapper执行从bean到JSON和JSON到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 REPORT或CONDITIONS EVALUATION REPORT中看到Spring Boot执行的自动配置。
- 可以通过以下方式从自动配置中排除类:
@SpringBootApplication (exclude={JacksonAutoConfiguration.class, JmxAutoConfiguration.class})
- 或在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接收所有请求,并将它们传递给应用程序的所有其他组件。
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)
它配置了basicErrorController、errorAttributes、ErrorMvcAutoConfiguration和DefaultErrorViewResolverConfiguration。它创建了默认的错误页面,即“白标签错误页面”。
另一个自动配置的内容是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的转换。