SpringBoot:进阶使用
跳到导航
跳到搜索
SpringBoot的web开发
Web开发的自动配置类:“org.springframework.boot.autoconfigure.web”包中:“WebMvcAutoConfiguration.class”类;(SpringMVC的自动配置)
自动配置:ViewResolver
“WebMvcAutoConfiguration.class”中:(一般不需要自行配置)
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
...
@Configuration
@Import(EnableWebMvcConfiguration.class)
@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {
...
private final WebMvcProperties mvcProperties;
...
@Bean
@ConditionalOnMissingBean
public InternalResourceViewResolver defaultViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix(this.mvcProperties.getView().getPrefix());
resolver.setSuffix(this.mvcProperties.getView().getSuffix());
return resolver;
}
@Bean
@ConditionalOnBean(View.class)
@ConditionalOnMissingBean
public BeanNameViewResolver beanNameViewResolver() {
BeanNameViewResolver resolver = new BeanNameViewResolver();
resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 10);
return resolver;
}
...
}
...
}
“WebMvcProperties”(“org.springframework.boot.autoconfigure.web”包中):
@ConfigurationProperties(prefix = "spring.mvc")
public class WebMvcProperties {
...
public static class View {
/**
* Spring MVC view prefix.
*/
private String prefix;
/**
* Spring MVC view suffix.
*/
private String suffix;
...
}
}
自动配置:静态资源位置
全局变量中配置springMVC解析规则:
server.port=8088
server.servlet-path=/
...
- “/”:Spring Boot的默认静态资源的路径为:“spring.resources.static-locations=classpath:/resources/”;
- 可以指定为“classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/”等;
- “*.xxx”:(或,不指定静态文件路径时)将静态资源放置到“webapp”下的“static”目录中即可通过地址访问;
自定义消息转化器
自定义消息转化器:只需要在“@Configuration”注解的类中,添加“@bean”注解的消息转化器方法,就会被Spring Boot自动加入到容器中:
@Controller
@SpringBootApplication(exclude = { RedisAutoConfiguration.class })
@Configuration
public class HelloApplication {
...
@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("ISO-8859-1"));
return converter;
}
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
系统中已有默认配置:(一般不需自行定义)
- “org.springframework.boot.autoconfigure.web”包中“HttpMessageConvertersAutoConfiguration.class”类;
@Configuration
@ConditionalOnClass(HttpMessageConverter.class)
@AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.class })
@Import({ JacksonHttpMessageConvertersConfiguration.class, GsonHttpMessageConvertersConfiguration.class })
public class HttpMessageConvertersAutoConfiguration {
...
@Configuration
@ConditionalOnClass(StringHttpMessageConverter.class)
@EnableConfigurationProperties(HttpEncodingProperties.class)
protected static class StringHttpMessageConverterConfiguration {
private final HttpEncodingProperties encodingProperties;
protected StringHttpMessageConverterConfiguration(
HttpEncodingProperties encodingProperties) {
this.encodingProperties = encodingProperties;
}
@Bean
@ConditionalOnMissingBean
public StringHttpMessageConverter stringHttpMessageConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
this.encodingProperties.getCharset());
converter.setWriteAcceptCharset(false);
return converter;
}
}
}
重写SpringMVC的配置
有些时候需要自已配置SpringMVC而不是采用默认;
比如说增加一个拦截器,这个时候就得通过继承“WebMvcConfigurerAdapter.class”(“org.springframework.web.servlet.config.annotation”包)然后重写父类中的方法进行扩展:
import ...
@Configuration
public class MySrpingMVCConfig extends WebMvcConfigurerAdapter{
// 自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
HandlerInterceptor handlerInterceptor = new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("自定义拦截器............");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
}
};
registry.addInterceptor(handlerInterceptor).addPathPatterns("/**");
}
// 自定义消息转化器的第二种方法
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converters.add(converter);
}
}