使用
@EnableWebMvc
@SpringBootApplication
public class Application {
public static void main(String[] args) {
log.debug("access {}","main");
SpringApplication.run(Application.class, args);
}
}
WebMvcConfigurerAdapter 实现类,配置跨域,添加静态页面等功能
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
RedisData redisData;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
}
原理
@EnableWebMvc注解注入了DelegatingWebMvcConfiguration的bean
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {
}
启动加载所有WebMvcConfigurer实例
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
public DelegatingWebMvcConfiguration() {
}
@Autowired(
required = false
)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if(!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
...
}
WebMvcConfigurerComposite 使用组合模式,是树枝节点
class WebMvcConfigurerComposite implements WebMvcConfigurer {
private final List<WebMvcConfigurer> delegates = new ArrayList();
WebMvcConfigurerComposite() {
}
public void addWebMvcConfigurers(List<WebMvcConfigurer> configurers) {
if(!CollectionUtils.isEmpty(configurers)) {
this.delegates.addAll(configurers);
}
}