MVC自动配置原理

目录

一、官网阅读

二、ContentNegotiatingViewResolver  (内容协商视图解析器)

ViewResolver 的源码: 

resolveViewName 

getCandidateViews 

三、Formatter 转换器和格式化器

四、修改SpringBoot的默认配置

五、扩展使用SpringMVC

⚪实现视图跳转


一、官网阅读

官网地址:Spring Boot Reference Documentation

二、ContentNegotiatingViewResolver  (内容协商视图解析器

ContentNegotiatingViewResolver  实现了视图解析器的类,就可以把它看做视图解析器

ViewResolver 的源码: 

public interface ViewResolver {
    @Nullable
    //resolveViewName 解析视图
    View resolveViewName(String viewName, Locale locale) throws Exception;
}

resolveViewName 

@Nullable
public View resolveViewName(String viewName, Locale locale) throws Exception {
    RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
    Assert.state(attrs instanceof ServletRequestAttributes, "No current ServletRequestAttributes");
    List<MediaType> requestedMediaTypes = this.getMediaTypes(((ServletRequestAttributes)attrs).getRequest());
    if (requestedMediaTypes != null) {
        //getCandidateViews 获取候选视图
        List<View> candidateViews = this.getCandidateViews(viewName, locale, requestedMediaTypes);
        //getBestView  获取最好的视图
        View bestView = this.getBestView(candidateViews, requestedMediaTypes, attrs);
        if (bestView != null) {
            return bestView;
        }
    }
    String mediaTypeInfo = this.logger.isDebugEnabled() && requestedMediaTypes != null ? " given " + requestedMediaTypes.toString() : "";
    if (this.useNotAcceptableStatusCode) {
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Using 406 NOT_ACCEPTABLE" + mediaTypeInfo);
        }
        return NOT_ACCEPTABLE_VIEW;
    } else {
        this.logger.debug("View remains unresolved" + mediaTypeInfo);
        return null;
    }
}

getCandidateViews 

private List<View> getCandidateViews(String viewName, Locale locale, List<MediaType> requestedMediaTypes) throws Exception {
    List<View> candidateViews = new ArrayList();
    if (this.viewResolvers != null) {
        Assert.state(this.contentNegotiationManager != null, "No ContentNegotiationManager set");
        Iterator var5 = this.viewResolvers.iterator();
        while(var5.hasNext()) {
            ViewResolver viewResolver = (ViewResolver)var5.next();
            View view = viewResolver.resolveViewName(viewName, locale);
            if (view != null) {
                candidateViews.add(view);
            }
            Iterator var8 = requestedMediaTypes.iterator();
            while(var8.hasNext()) {
                MediaType requestedMediaType = (MediaType)var8.next();
                List<String> extensions = this.contentNegotiationManager.resolveFileExtensions(requestedMediaType);
                Iterator var11 = extensions.iterator();
                while(var11.hasNext()) {
                    String extension = (String)var11.next();
                    String viewNameWithExtension = viewName + '.' + extension;
                    view = viewResolver.resolveViewName(viewNameWithExtension, locale);
                    if (view != null) {
                        candidateViews.add(view);
                    }
                }
            }
        }
    }
    if (!CollectionUtils.isEmpty(this.defaultViews)) {
        candidateViews.addAll(this.defaultViews);
    }
    return candidateViews;
}
//全面扩展SpringMVC
//如果想要diy一些定制化的功能,只需要写这个组件
// 然后将它交给springboot,springboot就睡帮助我们进行自动装配
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    //ContentNegotiatingViewResolver 实现了视图解析器的类,就可以把它看做视图解析器
    @Bean
    public ViewResolver myViewResolver(){
        return new MyViewResolver();
    }

    //
    public static class MyViewResolver implements ViewResolver{
        @Override
        public View resolveViewName(String viewName, Locale locale) throws IOException{
            return null;
        }
    }
}

三、Formatter 转换器和格式化器

@Bean
@Override
public FormattingConversionService mvcConversionService() {
	Format format = this.mvcProperties.getFormat();
	WebConversionService conversionService = new WebConversionService(new DateTimeFormatters()
			.dateFormat(format.getDate()).timeFormat(format.getTime()).dateTimeFormat(format.getDateTime()));
	addFormatters(conversionService);
	return conversionService;
}
public DateTimeFormatters dateFormat(String pattern) {
	if (isIso(pattern)) {
		this.dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
		this.datePattern = "yyyy-MM-dd";
	}
	else {
		this.dateFormatter = formatter(pattern);
		this.datePattern = pattern;
	}
	return this;
}

四、修改SpringBoot的默认配置

SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(如果用户自己配置@bean),如果有就用用户配置的,如果没有就用自动配置的;

如果有些组件可以存在多个,例如视图解析器,可以将用户配置的和默认的组合起来使用

五、扩展使用SpringMVC

编写类型为WebMvcConfigurer的@Configuration注解类

且不能标注@EnableWebMvc注解;

需要自己写一个;

新建一个包:config,创建类MyMvcConfig;

⚪实现视图跳转

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //视图跳转
    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/zhang").setViewName("test");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

elk-zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值