Spring,Spring boot和SpringMVC关系串想

Spring框架是一个大家族,再大的框架必然也是基于基础,所以说到这三个概念之间的关系,我想先梳理一下近几年java web项目开发框架的演变。

最初的静态页面以至于JSP这类技术暂不讨论,大部分人都是servlet开始入门的。其实每个JSP页面在执行的时候都会编译成一个servlet类文件,所以本质上JSP也是基于servlet的。

回忆一下最初是怎么通过写servlet开发web项目的,首先最重要的要有一个web.xml,web项目所有的请求url路由都会先到这个web.xml,现在的spring也是这样,只不过spring中请求到了web.xml有更好的处理方式。而最初只写servlet的话处理请求方法较为原始,需要在web.xml中配置好,一个servlet类对应一个请求,配置如图:

 很显然servlet类是处理请求的关键,重写三个方法init(),doFilter()和destroy(),如图:

package demo;
 
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
public class HelloFilter implements Filter {
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("Filter 初始化");
    }
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)req;
        System.out.println("拦截 URI="+request.getRequestURI());
        chain.doFilter(req, res);
    }
 
    @Override
    public void destroy() {
        System.out.println("Filter 结束");
    }
}

对应请求到了servlet类中后业务逻辑在doFilter()中处理,doFilter()返回类型是void,所以得在里面写跳转或者直接通过往HttpservletResponse中塞东西返回,servlet是双向有来有回的,最初大致是这样。

这样开发web项目的缺点很明显,项目中有多少业务逻辑要处理就要写多少servlet类文件,还都要在web.xml中配置,太麻烦了,后来spring就来了。

spring是带着AOP和IOC来的,但是解决上诉servlet开发问题的还是springMVC,只用spring的话还是有这个问题,这个暂且放一边后面会有解释。

先看看Spring有怎样的革新,我们都知道web项目是可以分为三层的,即web层,service层和dao层。注意这三层很容易和springMVC的三层混淆,其实并没有什么关系要区分,SpringMVC其实就是一种Spring的Web层的解决方案,这也是为什么上诉说SpringMVC真正解决了只用servlet开发问题。我理解的web层其实就是请求处理层,即请求是先到web层的,至于真正的业务处理还是在service层,dao层就不用说了,很多ORM框架例如Mybatis,Hibernate以及ibatis都是dao层解决方案。

从spring开始有了bean的概念,并且用Java Bean去管理bean。我们之前创建一个对象都是new出来的吧,而Spring可以将类作为bean配置在xml,类文件上用@Bean注解就可以不用new来创建对象了,Spring容器可以自己去管理对象的创建并注入和对象的销毁。再然后更方便了,也可以不用在xml中配置各种<bean>标签了,直接通过不同类型的注解如@Component,@Respository,@Service,@Controller等标注在不同类上表示不同类型的bean。如上就是IOC了即控制反转。至于AOP嘛大致就是切面编程暂且不论。到了,到这里为止,只用Spring的话没有解决之前说的servlet开发存在的请求路由问题,Spring的web层还是通过web.xml配置servlet类来匹配请求路由的,要想解决问题,这个时候就需要对web层使用解决方案了。

说道web层的解决方案,struts和SpringMVC就出现了,说白了SpringMVC就是对Spring的web层一个优化,至于SpringMVC的详细介绍之前文章有,这里就不赘述了。有了SpringMVC,web层的请求路由匹配问题就不需要大量写servlet类也不需要大量配置了。

到这里为止,web项目的开发框架已经比较成熟了,现在用的最多的还是Spring+SpringMVC+Mybatis。但是Spring+SpringMVC+Mybatis这种开发框架需要配置项还是很多啊,而且Spring是一个大家族,其他产品包括jpa,security等产品,如果想用他们又多了很多配置,就像用SpringMVC一样,还是很麻烦啊,这个时候Spring Boot就来了。

我理解的Spring Boot就是一个不需要大量配置文件就可以一锅炖的产品大杂烩,有一个starter概念,其实就是个jar包,想用SpringMVC了,想用jpa了,想用security了,就把对应的starter配置一下就好了。Spring Boot有一句话叫做约定优于配置,即Spring Boot不需要配置是因为很多配置项都是默认配置好的,当然你可以改。比如在Spring Boot中看不到SpringMVC的前端控制器,视图解析器包括处理器映射器适配器这些配置,都是封装配置好的,你当然可以重新配置。Spring Boot不但继承了Spring大家族中的产品,包括Tomcat也集成进去了,Spring Boot的项目打成了一jar丢到服务器中就可以跑,甚至不需要在服务器中装Tomcat。

最后总结一下,如果非要来个大小关系的话,Spring Boot > Spring > Spring MVC。 

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/84591807