菜鸟刷面试题(四、Spring/Spring MVC/Spring Boot/Spring Cloud篇)
目录:
- 为什么要使用 spring?
- 解释一下什么是 aop?
- 解释一下什么是 ioc?
- spring 有哪些主要模块?
- spring 常用的注入方式有哪些?
- spring 中的 bean 是线程安全的吗?
- spring 支持几种 bean 的作用域?
- spring 自动装配 bean 有哪些方式?
- spring 事务实现方式有哪些?
- 说一下 spring 的事务隔离?
- 说一下 spring mvc 运行流程?
- spring mvc 有哪些组件?
- @RequestMapping 的作用是什么?
- @Autowired 的作用是什么?
- 什么是 spring boot?
- 为什么要用 spring boot?
- spring boot 核心配置文件是什么?
- spring boot 配置文件有哪几种类型?它们有什么区别?
- jpa 和 hibernate 有什么区别?
- 什么是 spring cloud?
- SpringCloud与Dubbo的比较
- Eureka和Zookeeper都可以提供服务注册与发现的功能,请说说两个的区别。
- spring cloud 断路器的作用是什么?
- spring cloud 的核心组件有哪些?
为什么要使用 spring?
也就是说使用Spring有什么好处:
- 方便解耦,简化开发:Spring通过IOC容器解耦对象之间的依赖关系;如A对象初始化时需要依赖B对象,在使用Spring前每次初始化A对象时都需要传入B对象,如果哪一天A对象的初始化改了,那么引用A对象的所有地方都需要改,这样会非常麻烦。而将对象交给Spring管理的话,就只需要修改对应的配置文件就可以了。
- AOP、声明事务、单元测试等等支持。
- 方便集成各种优秀的框架:Spring不排斥各种优秀的框架,相反它还可以降级框架使用的难度,如Struts、Hibernate、Mybatis等等。
- 非常经典的学习范例:Spring的源码设计精妙、结构清晰、匠心独具,灵活应用了各种设计模式,如果你想提高自己的Java水平,那么学习Spring的源码会给你带来意想不到的效果。
- 等等。
解释一下什么是 aop?
面向切面编程,这种编程思想是在程序中找到一个切面,并将具有通用功能的业务流程抽取并单独封装;如日志的打印、事务、统计接口响应时间等等。
解释一下什么是 ioc?
IOC:控制反转,将程序中的对象交给Spring维护,而不是开发者维护。其核心思想就是资源不由使用资源的双方管理,而是交由第三方平台管理。
这样带来了很多好处:
- 资源集中管理,实现资源的可配和易管理。
- 降低了使用资源双方的依赖程序,也就是耦合度。
IOC思想的具体实现方法便是DI(依赖注入),也就是说依赖关系不是预定好的,而是由容器在运行期间定将依赖关系注入到组件中。
spring 有哪些主要模块?
Spring Code:核心类库,主要实现IOC功能,并且其它功能都依赖此库。
AOP:提供了AOP功能,并提供常用的拦截器等等。
ORM:提供常用的ORM框架辅助支持,如Hibernate、ibatis,它本身并不实现ORM,而是对ORM框架进行封装和管理。
DAO:提供JDBC支持,允许JDBC使用Spring资源,并统一管理事务。
WEB:提供常用Web框架,如Struts、JSF。
Context:提供Bean访问方式。
MVC:Spring实现了一套轻量级的MVC实现,相对于Struts来说Spring MVC更加简洁。
spring 常用的注入方式有哪些?
构造方法注入:可结合lombok使用,简化对象的声明。
setter方法注入:通过对象set方法注入属性。
基于注解注入:@Component、@Controller、@Service、@Repository这几种方式目前仅是语意上的差别。
spring 中的 bean 是线程安全的吗?
这取决于你的bean是否是有状态的;
默认情况下Spring的bean都是单例的,所以就一般业务开发中bean都是无状态的(比如DAO层),所以是线程安全的。
但你的bean是有状态的话(比如你要在bean中存储某些数据),就需要将bean的scope改成prototype,让每次请求都相当于重新new一个bean,这样就是线程安全的了。
spring 支持几种 bean 的作用域?
singleton:单例,也是默认的作用域。
prototype:原型,每次创建一个新的bean。
request:每次Http请求创建一个新的bean。
session:一个会话享用一个bean。
global-session:所有会话共享一个bean。
spring 自动装配 bean 有哪些方式?
1、隐式的bean发现机制或自动注入
- @AutoWired:根据类型注入bean。
- @Autowired + @Qualifier:若有相同类型,根据名称注入。
- @Resources:Java中根据名称注入的注解。
2、java config或xml:@Bean或xml
spring 事务实现方式有哪些?
编程式事务:通过在代码中调用commit、rollback等事务管理相关方法。
声明式事务:通过在xml中声明那些函数需要启用事务。
基于注解的声明式事务:@Transaction(rollbackFor = xxxException.class)
说一下 spring 的事务隔离?
1、事务隔离的几个概念
- 脏读:事务修改数据后还未提交,此时另一个事务也访问了这个数据,此时读出来的数据较脏读。
- 不可重复读:一个事务内读了多次数据(具有两份数据),但其它事务在第一个事务的两份数据读取之间(读第一份数据和第二份数据之间的时间差内)修改了数据,此时第一个事务的前后两次结果会不一致,这样的情况称为不可重复读。
- 幻读:当事务不独立执行时发生的一种现象,当第一个事务涉及到全表修改,第二个事务插入一行新数据,此时便会发生操作第一个事务的用户发现表中还有未修改的数据,就像发生幻觉一样。
2、Spring支持五种事务设置:
- DEFAULT:默认,由DBA指定。
- READ_UNCOMMITTED:会出现脏读、不可重复读、幻读(隔离级别最低,但并发性能最高)。
- READ_COMMINTTED:不出现不可重复读、幻读(锁定正在读取的行)。
- REPEATABLE_READ:会出现幻读(锁定所读取的所有行)。
- SERIALIZABLE:所有情况不会发生(锁表)。
说一下 spring mvc 运行流程?
1、用户请求首先会经过DispatchServlet,DispatchServlet接收到请求后会将请求信息交给处理映射器(HandlerMapping)。
2、HandlerMapping会根据请求的url找到对应处理器(Handler),并返回一个执行链。
3、DispatchServlet拿到执行链后再请求处理适配器(HandlerAdapter)来调用相应的Handler处理,然后返回ModelAndView给DispatchServlet。
4、DispatchServlet将ModelAndView请求视图解析器(ViewReslover)解析,并返回具体的View。
5、DispatchServlet对View进行渲染视图。
6、DispatchServlet将页面响应给用户。
参考:https://www.cnblogs.com/gxc6/p/9544563.html
spring mvc 有哪些组件?
- DispatcherServlet:前端控制器;用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
- HandlerMapping:处理器映射器;HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- Handler:处理器;Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
- HandlAdapter:处理器适配器;通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
- ViewResolver:视图解析器;View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
- View:视图;springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
参考:https://www.cnblogs.com/gxc6/p/9544563.html
@RequestMapping 的作用是什么?
@RequestMapping用于表示Controller层的请求地址,它可以标注在类或方法上。
标注在类上:此类下所有的方法都具有标注的父路径。
标注在方法上:此方法的路径。
@RequestMapping属性:
- value:访问路径值。
- method:请求方式,有GET、POST、PUT、DELETE等等。
- consumes、produces:分别表示请求和响应的数据格式,如application/json、text/html。
- params、headers:表示请求中必须包含某参数或某请求头。
@Autowired 的作用是什么?
根据类型注入一个bean,还可以配合@Qualifier完成根据名称注入一个bean。
什么是 spring boot?
SpringBoot是Spring体系下的一个子项目,其主要目的适用于简化Spring项目搭建的过程,从而使开发人员不需要定义样板化的配置。
为什么要用 spring boot?
1、简化Spring项目搭建的过程,节省成本。
2、SpringBoot整合了各式的框架,降低了其它框架使用的成本
3、简化部署成本,内置Tomcat,可以把下面打成war包,通过java -jar一键部署。
4、简化监控成本,SpringBoot提供了actuator。
spring boot 核心配置文件是什么?
application和bootstrap。
application:主要用于SpringBoot项目的自动化配置。
bootstrap:使用SpringCloud时使用,bootstrap加载优先于application,主要用于加载额外的配置信息,如远端git配置。
spring boot 配置文件有哪几种类型?它们有什么区别?
properties、yml。
区别:书写各式不一样,properties需要配置的全称,而yml可用:号、空格这些标准来简化properties这种格式。
SpringData Jpa和Hibernate有什么区别?
1、SpringData Jpa是JPA数据访问的抽象,Hibernate是JPA的一个实现。
2、使用SpringData的话你可以使用Hibernate、Eclipse Link或其它任何实现了JPA的框架。
什么是 spring cloud?
SpringCloud是一个微服务框架,而微服务其实就是一种架构模式、架构风格,从字面意思来看就知道它提倡的是将单一应用程序划分成一组小的服务,每个服务都运行在自己的进程中。
服务之间采用轻量级的restful通信,每个服务都围绕着自己的业务进行构建,可以选择合适的语言、存储方式,这极大的增强了服务的灵活性。
微服务的优缺点:
- 优点:
- 易理解:每个服务都足够内聚,这样的业务代码易理解。
- 开发简单、效率高:一个服务可能就是专一的做一件事,开发简单、效率高。
- 灵活性好:每个服务都可以使用不同的语言、存储方式、技术栈,开发或部署阶段都是独立的。
- 缺点:
- 运维成本高:不仅是开发人员要处理分布式系统的复杂性,运维人员也需要管理多个机器与服务。
- 服务通信成本、数据一致性、系统测试集成、性能监控等等。
SpringCloud与Dubbo的比较:
背景:SpringCloud是Apache旗下的Spring体系下的微服务解决方案,Dubbo是阿里体系下的分布式服务治理框架。
服务的调用:SpringCloud通过轻量级的Rest API调用,Dubbo通过RPC远程调用。
服务发现:SpringCloud使用Netflix下的Eureka作为服务发现,当然也可以用其它的服务发现,如ZK,但我们一般不会这样做;Dubbo使用第三方Zookeeper作为注册中心。
网关:SpringCloud使用Netflix下的Zuul,Dubbo需要使用其它第三方技术整合等等。
Eureka和Zookeeper都可以提供服务注册与发现的功能,请说说两个的区别。
著名CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)、P(分区容错性)。
由于分区容错性在分布式系统中是必须要保证的,因此我们只能在A和C之间进行权衡;
1、Eureka保证AP,Zookeeper保证CP。
2、由于作为注册中心可用性的需求要高于一致性,所以eureka貌似要比zookeeper更合理一些。
spring cloud 断路器的作用是什么?
断路器类似于电路中的保险丝,当保险丝烧断时会短暂的断开供电,让整个电路处于安全。
SpringCloud断路器也是同理,它可以有效的保护服务,使服务链路不因为一个服务的问题导致整个服务的瘫痪;不仅如此,它还提供了优雅的降级和熔断机制,以及请求合并、请求缓存。
spring cloud 的核心组件有哪些?
- 服务开发:Spring、SpringBoot、SpringMVC。
- 服务配置:Netflix Archaius、SpringCloud Config、Alibaba Diamond。
- 服务发现:Netflix Eureka、Zookeeper。
- 负载均衡:Netflix Ribbon、Nginx。
- 服务熔断:Netflix Hystrix。
- 服务调用:Rest、RPC等等:
- 服务接口调用:Netflix Feign。
- 服务网关:Netflix Zuul。
- 消息总线:SpringCloud Bus,可采用RabbitMQ、Kafka等等。