【面试】Spring、SpringMVC、SpringBoot的区别是什么

Spring面试必问:https://zhuanlan.zhihu.com/p/383701346

一、Spring 框架

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式 .

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
每个模块的功能如下:

  1. 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory ,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范 与实际的应用程序代码分开。
  2. Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文 包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
  3. Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了Spring框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于Spring
  4. 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
  5. Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。SpringDAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  6. Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  7. Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  8. Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText和 POI。

二、SpringMVC

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。

Spring MVC底层还是servlet

1、MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。
2、MVC主要作用是降低了视图与业务逻辑间的双向偶合。
3、MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。(类似于jsp)

Controller(控制器):接收用户请求,委托给模型进行处理(状态改变)就是之前的Servlet层,处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。

工作原理

Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。DispatcherServlet的作用是将请求分发到不同的处理器。


1、客户端请求提交到 DispatcherServlet。
2、由 DispatcherServlet 控制器寻找一个或多个 HandlerMapping,找到处理请求的 Controller。
3、DispatcherServlet 将请求提交到 Controller。
4、Controller 调用业务逻辑处理后返回 ModelAndView。
5、DispatcherServlet 寻找一个或多个 ViewResolver 视图解析器,找到 ModelAndView 指定的视图。
6、视图负责将结果显示到客户端。

ssm:(SpringMVC,Spring,Mybatis),由SpringMVC和Mybatis两个框架组成。
spring就相当于SpringMVC和Mybatis的粘合剂,用来链接这两个框架。

实例查看:SSM整合简单的例子

三、SpringMVC和SpringBoot

3.1 Spring和SpringMVC
  1. Spring是一个一站式的轻量级的Java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(SpringMVC)、业务层(IOC)、持久层(JDBCTemplate)等都提供了多种配置解决方案。
  2. SpringMVC是Spring基础之上的一个MVC框架,主要处理web开发的路径映射和试图渲染,属于Spring框架中WEB层开发的一部分。
3.2 SpringMVC和SpringBoot
  1. SpringMVC属于一个企业WEB开发的MVC框架,覆盖面包括前端视图开发、文件配置、后台接口逻辑开发等。XML、config等配置相对比较复杂。
  2. SpringBoot框架相对于SpringMVC框架说,更专注于微服务后台接口,不开发前端视图,同时遵循默认优于配置,简化了插件配置流程,不需要配置XML,相对于SpringMVC,大大简化了流程。

三、总结
1、Spring框架就像一个家族,有众多衍生产品,例如boot、security、jpa等。但他们的基础都是Spring的IOC、AOP等,IOC提供依赖注入,AOP解决了面向切面编程,然后在此两者的基础上实现了其它衍生产品的高级功能。

2、SpringMVC主要解决WEB开发的问题,是基于Servlet的一个MVC框架,通过XML配置,统一开发前端视图和后端逻辑。

3、由于Spring的配置非常复杂,各种XML、JavaConfig、servlet处理起来比较麻烦,为了简化开发者的使用,从而创造性的推出了SpringBoot框架,默认优于配置,简化了SpringMVC的配置流程;单区别于SpringMVC的是,SpringBoot专注于单体微服务接口开发,和前端解耦,虽然SpringBoot也可以做成SpringMVC前后端一起开发,但是这就有点不符合SpringBoot框架的初衷了。

Spring 是一个 “引擎”;

Spring MVC 是基于 Spring 的一个 MVC 框架;

Spring Boot 是基于 Spring4 的条件注册的一套快速开发整合包。

一 .Spring
spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。

spring主要的核心依赖有  beans  , code  , context  ,spel    这是spring里最基本的也是最核心的jar包(或者说是依赖)

spring有两个核心思想 (IOC (控制反转) , AOP(面向切面编程))

IOC (控制反转) :  控制反转就是一种思想 , 这个思想是怎么想的呢 , 就是对对象控制权的转移,从程序代码本身反转到了外部容器 。就是想把实体类 的生命周期交给spring去控制 , 让spring实现创建 ,实现初始化 , 实现销毁 . 这样就可以大大的免去在编写代码的过程中new一个对象 , 众所周知new 对象 是java代码编写里耦合性最大的一个事情 。

也说了IOC是一种思想 ,那么怎么把这种思想实现呢 ,如今比较流行的的方法是依赖注入 DI(Dependency Injection)

DI(依赖注入):是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。依赖注入是目前最优秀的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起的。

两者的关系就是ioc是一种思想 ,而DI确实一种实现方式 ,这里介绍了IOC,那么下面再来说下spring的另外一个核心思想AOP

AOP(面向切面编程) : 面向切面编程是对OOP(面向对象编程)的完善和补充 。

面向切面是面向对象中的一种方式而已。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程。

AOP采用一种称为“横切”的技术,将涉及多业务流程的通用功能抽取并单独封装,形成独立的切面,在合适的时机将这些切面横向切入到业务流程指定的位置中。

常见的使用场景有日志 ,事物管理以及数据库操作

实现的方式有schema和aspectJ ,后者比较好用

以上就是对spring的两个核心

动态代理原理:spring AOP采用动态代理来实现
(1)实现InvocationHandler接口

(2)创建代理类(通过java API)

Proxy.newProxyInstance(动态加载代理类,代理类实现接口,使用handler);

(3)调用invoke方法(虚拟机自动调用方法)

日志处理
 //调用目标对象
 method.invoke("目标对象","参数");
 日志处理

通过代理对象--(请求信息)-->目标对象---(返回信息)----> 代理对象

二 .springMVC
springmvc是spring的子框架,继承于spring框架 , 在ssm框架环境中,springmvc可以向上的扫描去用spring的东西,但是spring却不能扫描到springmvc里面去。

springmvc也是接收请求,返回响应 ,实际上也是一个servlet ,dispatchServlet。

1.性能比struts2好
2.简单、便捷,易学
3.和spring无缝衔接【IOC,AOP】
4.使用约定优于配置
5.支持Restful
6.异常处理,国际化,数据验证,类型转换等


springmvc的工作原理

用户对服务器发送请求,请求被前端控制器servlet DispatcherServlet(中央处理器)捕获,对请求URL进行解析,然后根据该URI,调用HandlerMapper(处理器映射器)获去该handler配置的所有相关的对象,然后根据获取的handler,选择一个合适的handlerAdapter(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法) 。 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
ViewResolver 结合Model和View,来渲染视图
将渲染结果返回给客户端。

springmvc和servlet的流程其实是差不多的,都是接受请求,返回响应

所有说springmvc真的是个非常简单好用的框架

三.mybatis
mybatis是目前非常流行的持久层框架,功能很强大,然而其实现却比较简单、优雅。

mybatis是一个半自动的orm框架,也还是需要自己去写sql语句

mybatis是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情:

封装JDBC操作
利用反射打通Java类与SQL语句之间的相互转换
mybatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。

mybatis和大部分框架一样需要一个配置文件,如果是和spring整合的话则不怎么需要,当然如果要开启缓存的话还是需要 

然后需要mapper映射文件和dao层的类和方法所对应   , 在mapper里面写sql语句

单独的mybatis使用需要解析配置文件,然后去调用mapper里的sql语句

InputStream in = Resources.getResourceAsStream("MyBatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session = factory.openSession();
  List<User> list =session.selectList("com.liy.dao.IUserDao.query");
         for (User user : list) {
             System.out.println(user);
         }
         
         session.close();

这是mybatis运用的步骤
 

1、什么是spring boot,它主要有哪些优点

Springboot是spring的子项目,称为一站式解决方案,集成了外部很多的优秀的框架,如常用的mysql、jdbc。

主要优点:通过maven导入各种jar包,可以减少jar包的冲突;屏息了繁琐的xml配置文件;集成的开发框架,可以做到开箱即用

2、spingboot核心注解有哪些,都代表什么意思

核心注解主要包含3个:

1、@SpringBootConfiguration:实现配置文件功能

2、@EnableAutoConfiguration:开启自动配置功能

3、@ComponentScan:组件扫描

3、springboot中如何解决跨域问题

跨域都是通过前端JSONP来解决,但只能处理get类型请求,像post、put、delete就不支持,所以一般采用后端跨域通过WebMvcConfiguration接口来重写addCorsMappings方法,解决跨域问题。

4、在springboot微服务设计中,如何实现session共享

在微服务中,因为一个项目被拆分成多个子项目,导致内存中的session不一致,所以可以采取spring session+redis方式,将session统一保存在redis中。

5、springboot需要独立的容器启动项目吗

不需要,springboot自带tomcat、jetty。

6、springboot运行方式有几种

一般有三种,将springboot打包发到容器中;也可直接运行main主方法;也可以mavern插件运行。

7、在springboot工程中,无需重启系统,实现项目更新

这就涉及到springboot热部署的问题,只需安装devtools工具包,就能实现修改后的文件,通过Ctrl+F9来实现热更新

8、YAML在springboot中的作用

使得springboot配置文件更加有层次感,结构也比较清晰,不容易混淆,目前也是人类可读的数据序列化语言。

9、在spingboot配置环境文件中,它们的加载顺序是什么

排序:properties文件、yaml文件、系统环境变量、命令参数等配置文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常生果

喜欢我,请支持我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值