SpringBoot-自动配置原理
配置文件注入
简单yml配置
spring:
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
server:
port: 8888
context-path: /text
@ConfifigurationProperties注入和@Value注入区别
自定义start组件整合到spring boot
所谓的整合到springboot其实就是让我们在使用的这个springboot容器能够加载我们自定义的start,让我们start
Spring Boot自动配置spring mvc原理
- SpringBoot 在启动的时候会去读取根目录下面的META-INF的spring.factories。这里面都是一些springboot写好的配置类,spring容器会依次扫描这些类并且加载到容器中去。
DispatcherServlet自动加载
将DispatcherServlet 注册成bean
将DispatcherServlet 放入 web容器中
@Bean(
name = {"dispatcherServletRegistration"}
)
@ConditionalOnBean(
value = {DispatcherServlet.class},
name = {"dispatcherServlet"}
)
public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
// 这是 一个Servlet注册器,在这里设置了 Mapping
ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServlet().getServletMapping()});
registration.setName("dispatcherServlet");
//设置了LoadOnStartup 默认 -1
registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
if (this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
}
- 为什么把ServletRegistrationBean 添加到容器中就可以了?
我们来看看ServletRegistrationBean 的继承关系。
来看看ServletContextInitializer
很熟悉的一个类,也就是说这个类在web容器跑起来的时候就会被运行,那么这个注册器就会去把相对应的类注册到我们的web容器中。那么我们看看还有哪一些也可以这样的方法注入:
SpringMVC-WEB自动配置
自动配置消息转换器
- 在注入WebMvcAutoConfigurationAdapter这个bean的时候,是使用构造器生成bean。而构造器中参数有:
- messageConverters
所以会把spring容器里面的所有消息转换器都注入到messageConverters这个属性中,也就是说我们配置自己的消息转换器只要**@Bean** 就可以了。
- messageConverters
配置拦截器
- 由于springBoot没有去自动配置拦截器所以需要我们去配置一个配置文件。
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new AdminInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"你的登陆路径", //登录
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css", //css静态资源
"/**/*.woff",
"/**/*.ttf"
);
}
}
视图解析器自动配置
springboot只会默认注入一个视图解析器:ContentNegotiatingViewResolver
获取所有的候选者,再筛选出最好的View。而且在初始化的时候会去加载spring容器里面多有的视图解析器。配置的时候只要@Bean 就可以使用。
配置过滤器
@Slf4j
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info(filterConfig.getFilterName() + " init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
log.info("myFilter2 begin");
try {
log.info("业务方法执行");
//拦截链;
chain.doFilter(request, response);
} catch (Exception e) {
log.error("error!", e);
}
log.info("myFilter2 end");
}
@Override
public void destroy() {
}
}
//新建配置类WebConfig.java,配置bean,代码如下:
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean testFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean(new MyFilter2());
registration.addUrlPatterns("/test"); //
registration.setName("myFilter2");
return registration;
}
}