springbooot启动原理
一、过滤器
-
首先在启动类加注解
@SpringBootApplication @ServletComponentScan //用于进行servlet组件扫描 public class Springboot03Application { public static void main(String[] args) { SpringApplication.run(Springboot03Application.class, args); } }
-
自定义UserFilter 类,实现Filter接口,实现其中的三个方法
init
、doFilter
、destroy
/** * 基于servlet3.x版本的过滤器,所以需要使用注解 */ @WebFilter(urlPatterns = "/api/*", filterName = "loginFilter") public class UserFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化操作-----------"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //获取用户名 String name = request.getParameter("name"); //如果获取的用户名与给定的用户名相同,则放行 if("jack".equals(name)){ filterChain.doFilter(servletRequest,servletResponse);//如果当前名字是Jack,则放行 }else{ response.sendRedirect("/login.html"); } } @Override public void destroy() { System.out.println("销毁操作-------"); } }
二、自定义拦截器
-
自定义拦截器类,实现
HandlerInterceptor
接口
preHandle :调用Controller某个方法之前
postHandle :Controller之后调用,视图渲染之前,若控制器Controller出现异常,则不执行此方法
afterCompletion :不管有没有异常,这个afterCompletion都会被调用,用于资源清理@Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true; //false代表拦截 true代表放行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion"); } }
-
自定义类加注解
@Configuration
并实现 WebMvcConfigurer 接口类,重写addInterceptors(){}/** * 自定义拦截器 */ @Configuration public class MyMvcConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { System.out.println("addInterceptors"); registry.addInterceptor(loginInterceptor).addPathPatterns("/api/*/**"); } }
-
将1中的自定义拦截器加入到步骤2中的addInterceptors(){}方法中。
附:拦截器失效原因:
1)检查是否有注解@Configuration
2)拦截路径是否有 ** 和 *
3)拦截器最后路径一定要是 “/**”, 如果是目录的话则是 /*/
三、模板引擎 thymeleaf 与 freemark
-
Freemarker Template Lanaguage (FTL) 文件后缀是.ftl
特点:严格依赖MVC模式,不依赖Servlet容器。不消耗性
基础配置:#freemarker基础配置 # 是否开启thymeleaf缓存,本地为false,生产建议为true spring.freemarker.cache=false spring.freemarker.charset=UTF-8 spring.freemarker.allow-request-override=false spring.freemarker.check-template-location=true #类型 spring.freemarker.content-type=text/html spring.freemarker.expose-request-attributes=true spring.freemarker.expose-session-attributes=true #文件后缀 spring.freemarker.suffix=.ftl #路径 spring.freemarker.template-loader-path=classpath:/templates/
引入freemarker模板引擎的依赖
<!-- 引入freemarker模板引擎的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
-
Thymeleaf(springboot 主推)
特点:轻量级模板引擎,页面有复杂业务,不推荐使用。比如页面有很多个判断(会导致解析DOM或者XML占用过多内存)。
基础配置:#thymeleaf基础配置 #开发时关闭缓存,不然没法看到实时页面 spring.thymeleaf.cache=false spring.thymeleaf.mode=HTML5 #前缀 spring.thymeleaf.prefix=classpath:/templates/ #编码 spring.thymeleaf.encoding=UTF-8 #类型 spring.thymeleaf.servlet.content-type=text/html #名称的后缀 spring.thymeleaf.suffix=.html
引入thymeleaf相关maven依赖
<!--thymeleaf相关maven依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
四、starter
- starter的作用
主要用于简化依赖,比如:spring-boot-starter-web中包含了很多依赖 - 参考文档
starter参考文档