Springboot自定义组件
前言:讲自定义组件前先要明白每个组件是干什么的,在项目运行中起着什么作用。这样我们知道在什么时候应该怎么样去配置组件,所以我们需要先来了解SpringMVC的运行流程
SpringMVC
springMVC的核心在于其流程,它是一种 Servlet 的技术,它提供了核心控制器 DispatcherServlet 和相关的组件,制定了松散的结构;为了让大家对SpringMVC 有一个大致的认识,先给出它接收请求,处理请求,最后响应浏览器的流程图;
- 发送请求到
前端控制器 DispatcherServlet - 通过
处理器映射 找到对应的处理器 ,生成处理器对象及处理器,拦截器 - 要运行处理器就需要一个对应的环境(
适配器 ),通过适配器就会运行对应的处理器(包含了控制器的内容和其他增强的功能)、拦截器 - 处理器执行完返回
模型和视图 给dispatcherServlet - dispatcherServlet将模型传递给
视图解析器 - 视图解析器解析完把模型渲染到视图中
- 最后将视图响应给用户
再尝试用自己的理解快速过一遍:请求到dispatcherServlet,通过handlerMapping映射到对应的handler及Interceptor,再通过HandlerAdapter去执行,返回对应的ModelAndView,用ViewResolver去解析,生成view,响应用户;
大家有时间可以看看SSM框架中纯手工配置前端解析器,视图解析器,上下文监听器,拦截器…
了解一下SpringMVC的几个组件就够了,至于springmvc-servlet.xml的配置就不写出来了,毕竟现在springboot都是自动配置的。
springMVC流程及配置可以参考这篇文章:https://blog.csdn.net/floating_dreaming/article/details/89089214
SpringBoot-拦截器
自定义springmvc组件配置到Springboot中:
- 自定义一个拦截器MyInterceptor
- 继承HandlerInterceptor 接口
- 实现相应方法
- 在方法中编写通过拦截器的条件
- 自定义webMvcConfig
- 继承WebMvcConfigurer接口
- 实现addInterceptor方法
- 在方法中定义要拦截的路径和不需拦截的路径
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object username = session.getAttribute("username");
if (username == null || username.equals("")){
request.setAttribute("msg", "无权限请先登录");
request.getRequestDispatcher("/index").forward(request, response);
return false;
}
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 {
}
}
@Configuration
public class LoginMVCConfig implements WebMvcConfigurer {
@Bean
public LoginInterceptor loginInterceptor() {
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/","/index","/css/**", "/js/**", "/img/**");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
}
}
以上是添加拦截器的例子在springboot上自定义了一个组件,其实springboot中的组件都有默认的一个配置,而且是自动配置好的。只是我们通过了解了每个组件的作用之后,我们就可以自己去配置添加这些组件,破坏掉它默认的配置。其实这对于我们了解springboot也好,写需求也好,解决bug也好,都有很大的帮助。
最后,说一下,对于我们在springboot中自定义添加任何组件,都是需要去继承一个WebMvcConfigurer 这个类的,然后将我们的组件通过对应的方法里面的registry 参数,配置组件并添加到容器中;
可重写的方法太多啦,但是大家可以看到很都是springmvc运行流程中相关的组件,所以只要知道了每个组件是做什么的,其实很好去对springboot进行配置添加组件的。其实这也是springboot的自动配置的潜在原理了把,就是把SSM中需要使用xml配置文件配置的组件,拿来进行封装,然后我们需要的时候,只要去重写他的方法就好了。
这里推荐给大家对webConfigconfigurer详解 的一篇文章(对常用方法的重写):https://blog.csdn.net/zhangpower1993/article/details/89016503
下一篇文章:excel的导入导出
|