springboot优势
创建独立的spring应用
内嵌web容器
自动starter依赖,简化构建配置
自动配置spring以及第三方功能
提供生产级别的监控、健康检查及外部化配置
无代码生成,无需编写xml
常用注解
@Configuration:写在配置类上,生效后功能和AutoConfiguration类一样
属性proxyBeanMethods:默认true,单实例的代理对象
@Bean:JavaBean注入到容器中
@Import:把指定的组件导入容器,默认组件的名字就是全类名
@Conditional:条件装配
@ConditionalOnBean:当容器中有某个bean,才注入该注解标注的类或bean
@ImportResource:导入xml配置,写在配置类上
@ConfigurationProperties:绑定配置,写在要绑定的类上,在properties文件中写入值
@EnableConfigurationProperties:写在配置类上,属性是要绑定的bean类,开启这个bean类的配置绑定功能
自动配置原理
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
@SpringBootConfiguration:@Configuration表示当前类是配置类
@ComponentScan:指定包扫描路径
@EnableAutoConfiguration:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
@AutoConfigurationPackage:自动配置包,@Import({Registrar.class}),导入Registrar这个类,给容器批量注册组件,指定包扫描路径。
@Import({AutoConfigurationImportSelector.class}):获取所有需要自动配置的类,从META-INF/spring.factories找到,spring-boot-autoconfigure-2.3.10.RELEASE.jar的spring.factories中读取。
springboot会默认自动配置所有用到的组件,如果用户配了,就优先用客户的。
自动配置类属性绑定:@EnableConfigurationProperties指定自动配置类的配置属性的类
静态资源存放路径
Static resources can be moved to /public (or /static or /resources or /META-INF/resources) in the classpath root. The same applies to messages.properties (which Spring Boot automatically detects in the root of the classpath).
当访问/+静态资源路径,controller层响应
原理:静态资源映射/**
spring:
mvc:
static-path-pattern: /res/**
上面的配置会影响欢迎页和favicon.ico的访问
一个配置类如果只有一个有参构造器,那么它的所有参数的值都会从容器中赋值。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/”}; 默认设置的静态资源路径
HandlerMapping:处理器映射,保存了每一个Handler能处理哪些请求。
if (welcomePage != null && “/**”.equals(staticPathPattern)) {
logger.info("Adding welcome page: " + welcomePage);
this.setRootViewName(“forward:index.html”); 默认设置了欢迎页的访问路径。
基于表单使用REST风格
public class HiddenHttpMethodFilter extends OncePerRequestFilter {
private static final List ALLOWED_METHODS;
public static final String DEFAULT_METHOD_PARAM = “_method”;
private String methodParam = “_method”;
还要配置springboot打开页面表单REST支持
@ConditionalOnProperty(
prefix = “spring.mvc.hiddenmethod.filter”,
name = {“enabled”},
matchIfMissing = false
) ,默认是关闭的
大小写的delete都行
<form action="/user" method="post">
<input type="hidden" name="_method" value="DELETE">
<input value="REST-DELETE" type="submit"></input>
</form>
<form action="/user" method="get">
<input type="submit" value="REST-GET">
</form>
DispatcherServlet
所有请求都从doService 方法开始处理
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
Iterator var2 = this.handlerMappings.iterator();
while(var2.hasNext()) {
HandlerMapping mapping = (HandlerMapping)var2.next();
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
然后根据请求类型,request获得handler既controller的方法。