Предисловие
Мы также знаем, что Springboot позволяет использовать SpringMVC без какой-либо настройки. Его можно легко использовать. Но если вы не понимаете принцип, это, вероятно, станет головной болью, если вы столкнетесь с некоторыми проблемами в процессе разработки. Независимо от того, глубоко ли вы это понимаете. или нет, давайте сначала поговорим об этом... Давайте сначала поговорим об этом
... Сначала загляните на официальный сайт... Моя версия - версия 2.3.2, и я обнаружил, что официальный сайт также сильно изменился ... Различные версии можно скачать самостоятельно.Хотя структура изменилась, содержание изменилось незначительно... Изменения отмечены: рассматриваются
далее в этом документе
Принцип автоматической настройки SpringMVC
Автоконфигурация добавляет следующие функции поверх настроек Spring по умолчанию.
Два bean-компонента ContentNegotiatingViewResolver и BeanNameViewResolver настраиваются в WebMvcAutoConfiguration.
- ViewResolver настраивается автоматически (преобразователь представления: объект представления (View) получается в соответствии с возвращаемым значением метода, а объект представления определяет способ рендеринга (перенаправление? перенаправление?))
- ContentNegotiatingViewResolver: объединяет все преобразователи представлений;
- Как настроить: Мы можем сами добавить преобразователь представлений в контейнер, автоматически объединить его;
- код
@SpringBootApplication
public class ComWebApplication {
public static void main(String[] args) {
SpringApplication.run(ComWebApplication.class, args);
}
@Bean
public ViewResolver myViewReolver(){
return new MyViewResolver();
}
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
return null;
}
}
}
- Поддержка обслуживания статических ресурсов, включая поддержку WebJars (см. ниже).Путь к папке со статическим ресурсом, веб-джары описаны в правилах сопоставления статических ресурсов.
- Автоматически регистрируются компоненты Converter, GenericConverter, Formatter.Конвертер
: конвертер;
public String hello(пользователь-пользователь): преобразование типов использует
форматтер Converter Formatter;2017.12.17===Date;
public void addFormatters(FormatterRegistry registry) {
ApplicationConversionService.addBeans(registry, this.beanFactory);
}
Конвертер форматтера мы добавили сами, нам нужно только поместить его в контейнер
-
HttpMessageConverter: SpringMVC используется для преобразования Http-запросов и ответов;
-
-HttpMessageConverters определяются из контейнера, получить все HttpMessageConverter,
добавить HttpMessageConverter в контейнер самостоятельно, нужно только прописать в контейнере свои компоненты (@Bean, @Component) -
Автоматическая регистрация MessageCodesResolver (см. ниже).Определение правил генерации кодов ошибок.
-
Поддержка статического index.html. Статическая домашняя страница описана в правилах сопоставления статических ресурсов.
-
Поддержка пользовательских значков (описана ниже в этом документе). favicon.icon описан в правилах статического сопоставления ресурсов.
-
Автоматическое использование bean-компонента ConfigurationWebBindingInitializer (см. ниже).Мы
можем настроить ConfigurationWebBindingInitializer для замены значения по умолчанию (добавлено в контейнер)
инициализировать WebDataBinder,
запросить данные ===== JavaBean;
расширение SpringMVC
Автоматическая настройка Springboot далека от удовлетворения наших потребностей в разработке и производстве, поэтому нам необходимо самостоятельно расширить некоторые функции,
например то, что мы изначально написали в файле конфигурации Springmvc.
<mvc:view‐controller path="/hello" view‐name="success"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean></bean>
</mvc:interceptor>
</mvc:interceptors>
Нам всем необходимо настроить в соответствии с реальными потребностями
Если вы хотите сохранить эти настройки Spring Boot MVC и внести дополнительные настройки MVC (перехватчики, средства форматирования, контроллеры представлений и другие функции), вы можете добавить свой собственный класс @Configuration типа WebMvcConfigurer, но без @EnableWebMvc.
Если вы хотите сохранить эти настройки Spring Boot MVC и выполнить дополнительные настройки MVC (перехватчики, средства форматирования, контроллеры представлений и другие функции), вы можете добавить свой собственный класс @Configuration типа WebMvcConfigurer, но без добавления @EnableWebMvc.
@Configuration
public class MySpringMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//浏览器发送hello 跳转到success页面
registry.addViewController("/hello").setViewName("success");
}
}
Напишите класс конфигурации (@Configuration), который имеет тип WebMvcConfigurer; @EnableWebMvc не может быть отмечен; старая версия — WebMvcConfigurerAdapter, которая является абстрактным классом и не имеет пустых методов. Он сохраняет всю автоматическую настройку и также может использовать наши расширенные конфигурация
;
Давай выясним
принцип:
- WebMvcAutoConfiguration — это класс автоматической настройки SpringMVC.
- , будет импортирован при выполнении другой автоматической настройки; @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@Configuration(
proxyBeanMethods = false
)
@Import({
WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@EnableConfigurationProperties({
WebMvcProperties.class, ResourceProperties.class})
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
EnableWebMvcConfiguration类
@Configuration(
proxyBeanMethods = false
)
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {
private final ResourceProperties resourceProperties;
Родительский класс EnableWebMvcConfiguration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
public DelegatingWebMvcConfiguration() {
}
//从容器中获取所有的WebMvcConfigurer
@Autowired(
required = false
)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
//; Вызов всех конфигураций, связанных с WebMvcConfigurer, вместе;
public void addWebMvcConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.delegates.addAll(configurers);
}
}
-
, все WebMvcConfigurers в контейнере будут работать вместе.
-
, наш класс конфигурации также будет вызван;
эффект: автоматическая конфигурация SpringMVC и наша расширенная конфигурация будут работать;
обратите внимание, что то, что здесь сказано, будет работать для разных конфигураций, таких как настроенное статическое сопоставление файлов и некоторый viewController. Подождите, пока они будут работать вместе.
WebMvcРегистрации
Если вы хотите предоставить собственные экземпляры RequestMappingHandlerMapping, RequestMappingHandlerAdapter или ExceptionHandlerExceptionResolver и при этом сохранить настройки Spring Boot MVC, вы можете объявить компонент типа WebMvcRegistrations и использовать его для предоставления пользовательских экземпляров этих компонентов.
Полный контроль над SpringMVC
Если вы хотите получить полный контроль над Spring MVC, вы можете добавить свою собственную @Configuration с аннотацией @EnableWebMvc или, альтернативно, добавить свою собственную DelegatingWebMvcConfiguration с аннотацией @Configuration, как описано в Javadoc @EnableWebMvc. Вы можете добавить свою собственную аннотированную
@Configuration с @EnableWebMvc или следуйте инструкциям в Javadoc для @EnableWebMvc, чтобы добавить свой собственный @Configuration с аннотацией DelegatingWebMvcConfiguration.
принцип:
Почему не удается выполнить автоматическую настройку @EnableWebMvc?
- @EnableWebMvc
@Import({
DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
Похоже, это означает, что мы импортировали WebMvcConfigurationSupport.
- Мы знаем, что WebMvcAutoConfiguration — это основной класс автоматической настройки Springmvc. Он работает только при отсутствии компонента WebMvcConfigurationSupport.
@ConditionalOnClass({
Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({
WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({
DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
Итак, в настоящее время мы знаем, что класс WebMvcAutoConfiguration недействителен.
- Импортированный WebMvcConfigurationSupport — это лишь самая базовая функция SpringMVC;
Как изменить конфигурацию SpringBoot по умолчанию
Режим:
1) Когда SpringBoot автоматически настраивает множество компонентов, он сначала проверяет, есть ли в контейнере настроенные пользователем (@Bean, @Component). Если есть, используйте настроенные пользователем. Если нет, он автоматически настроит их; если некоторые компоненты могут это сделать. Существует несколько (ViewResolvers), которые объединяют пользовательские конфигурации и конфигурации по умолчанию;
2) в SpringBoot будет много xxxConfigurers, которые помогут нам с расширенными конфигурациями
3), в SpringBoot будет много xxxCustomizers, которые помогут нам с индивидуальные конфигурации