声明:本文仅做学习与交流,在此记录方便日后查阅,同时希望也能帮助到正在看这篇文章的你。
目录
Spring框架
SpringBoot框架
Mybatis Puls框架
微服务相关
面试题答案
Spring框架面试题答案:
1、什么是Spring?
答:Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。它可以集成其他框架,如Structs、Mybatis等,所以又称为框架的框架。
2、说出几个常用的Spring的几个注解?
答:@Autowired:当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去;
@Controller:标注一个控制器组件类;
@Service:标注一个业务逻辑组件类;
@Component:标准一个普通的spring Bean类。
3、怎么开启Spring的注解装配?
答:注解装配在默认情况下是不开启的。为了使用注解装配,我们必须在Spring配置文件中配置
4、谈谈自己对Spring Ioc和Aop的理解?
答:IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。IoC 在其他语言中也有应用,并非 Spirng 特有。
IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。
IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
AOP(Aspect-Oriented Programming:面向切面编程) 能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。
使用 AOP 之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性。日志功能、事务管理等等场景都用到了 AOP 。
5、解释一下Spring Bean的生命周期?
答:如下
实例化bean对象(通过构造方法或者工厂方法)
设置对象属性(setter等)(依赖注入)
如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。
如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
调用Bean的初始化方法
将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法使用Bean
容器关闭之前,调用Bean的销毁方法
6、Spring的事务有几种方式?谈谈Spring的事务隔离级别和传播行为?
答:编码方式、spring配置方式、注解式
隔离级别有5种
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别
未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 (serializable) :避免以上所有读问题.
Spring事务的传播行有7种
保证同一个事务中
PORPAGATION_REQUIRED:支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS:支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY:支持当前事务,如果不存在,抛出异常
保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行
7、说说Spring的优点和缺点?
答:Spring的优势:
提供了一种管理对象的方法,可以把中间层对象有效地组织起来。一个完美的框架“黏合剂”。
采用了分层结构,可以增量引入到项目中。
有利于面向接口编程习惯的养成。
目的之一是为了写出易于测试的代码。
非侵入性,应用程序对Spring API的依赖可以减至最小限度。
一致的数据访问介面。
一个轻量级的架构解决方案。
Spring的缺点:
中断了应用程序的逻辑,使代码变得不完整,不直观。此时单从Source无法完全把握应用的所有行为。
将原本应该代码化的逻辑配置化,增加了出错的机会以及额外的负担。
时光倒退,失去了IDE的支持。在目前IDE功能日益强大的时代,以往代码重构等让人头痛的举动越来越容易。而且IDE还提供了
诸多强大的辅助功能,使得编程的门槛降低很多。通常来说,维护代码要比维护配置文件,或者配置文件+代码的混合体要容易的多。
调试阶段不直观,后期的bug对应阶段,不容易判断问题所在。
8、什么是Spring的自动装配?
答:自动装配是Spring框架的重要功能,是使用Spring满足bean依赖的一种方式,Spring会在应用中为某个bean寻找其依赖的bean,Spring中bean有三种装配机制,分别是:在xml中显示配置、在java中显示配置以及隐式的bean发现机制和自动装配。
9、Spring的设计模式你了解吗?试着说出两三个Spring中的运用的设计模式?
答:有以下几种设计模式
实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。
DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。
实现方式: AOP底层,就是动态代理模式的实现。
动态代理:在内存中构建的,不需要手动编写代理类
静态代理:需要手工编写代理类,代理类引用被代理对象。
SpringBoot框架面试题答案:
1、什么是SpringBoot?
答:Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
2、SpringBoot与SpringMVC相比有什么特点?
答:Springboot是一个微服务框架,延续了spring框架的核心思想IOC和AOP,简化了应用的开发和部署。Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。提供了一堆依赖打包,并已经按照使用习惯解决了依赖问题--->习惯大于约定。
3、谈谈创建SpringBoot项目的几种方式?
答:大约有五种方式
通过Web界面使用。
通过Spring Tool Suite使用。
通过IntelliJ IDEA使用。
使用Spring Boot CLI使用。
单纯地使用gradle或者maven来构建。
4、什么是自动配置?
答:什么是自动配置?举例来讲,当你通过@Autowired或@Resource注解,自动注入一个类实例之前,被注入进来的这个类实例需要被spring容器纳管,不然肯定会注入失败。往往我们会在xml通过`bean id="dfdf"` 或者在类定义上使用@Component、@Configuration等注解,来实现其被spring容器管理。而对于jar包中的类,则稍微复杂一点,要根据jar包中类的实现进行相应引入。
而spring boot的自动配置功能,会对我们配置的一些类,自动注入到spring容器中。特别是对于依赖的jar包中的一些类,在我们的工程用到这些类实例时,直接@Autowired或@Resource注解注入使用就可以了。
5、SpringBoot的常用注解说出几个?
答:有以下几种常用注解
@PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过;
@Api @ApiOperation @ApiParam主要是用于swagger提供开发者文档,文档中生成的注释内容;
@RequestBody可以直接将页面中的参数封装成实体类中的数据传输给后台;
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写;
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写;
@PostMapping是一个非 组合注解,需要自定义请求方式。
6、如何使用SpringBoot构建RESTful WEB服务?
答:以下步骤即可
使用@RestController注解>@RestController 相当于 @ResponseBody + @Controller的结合
使用@RequestMapping注解>这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。
使用@RequestParam注解>RequestParam可以接受简单类型的属性,也可以接受对象类型。实质Request.getParameter()中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。
使用@SpringBootApplication注解>@SpringBootApplication是一个组合注解,包括@EnableAutoConfiguration, @Configuration 和@ComponentScan。
8、SpringBoot怎样使用事务的?
答:Spring Boot 使用事务非常简单;
首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional便可。
9、SpringBoot打包方式分为哪几种?在项目中一般是通过哪种打包方式什么部署的?
答:jar包、war包;项目中一般使用jar包
Mybatis Puls框架面试题答案:
1、什么是Mybatis Plus?
答:MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具, 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2、说出几个Mybatis Plus的常用注解?
答:有以下几个常用注解
@TableName:对数据表名注解;
@TableId:表主键标识;
@TableField:表字段标识;
@Version:乐观锁注解、标记;
@TableLogic:表字段逻辑处理注解(逻辑删除);
@SqlParser:租户注解;
@EnumValue:通枚举类注解。
3、Mybatis Plus插入语句之后如何返回主键?
答:数据的主键id值,可以直接在插入后通过Integer id = 实体类getId()获取。
4、Mybatis Plus的逻辑删除怎么实现?
答:给表增加deleted字段,用于表示数据是否被删除,可以定义:1代表删除,0代表未删除。
同时,也修改实体,增加deleted属性并且添加@TableLogic注解:
在application.properties中配置(基于springboot);
逻辑已删除值(默认为1)
mybatis-plus.global-config.db-config.logic-delete-value=1
逻辑未删除值(默认为0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0
5、怎样用Mybatis Plus实现表主键自增?
答:@TableId(type=IdType.AUTO)
6、Mybatis Plus相比Mybatis有什么优势?
答:Mybatis-Plus是一个Mybatis的增强工具,它在Mybatis的基础上做了增强,却不做改变。我们在使用Mybatis-Plus之后既可以使用Mybatis-Plus的特有功能,又能够正常使用Mybatis的原生功能。Mybatis-Plus(以下简称MP)是为简化开发、提高开发效率而生,但它也提供了一些很有意思的插件,比如SQL性能监控、乐观锁、执行分析等。
微服务相关面试题答案:
1、谈谈你对微服务的理解?
答:微服务是个说的挺长时间的概念,也是比较成熟的技术体系。像 Spring Cloud,甚至提供了微服务所需要的全套框架,包括注册中心 (Eureka)、配置中心 (Config)、断路器 (Hytrix)、API 网关 (Zuul) 等组件。微服务体系庞杂,每个组件都能独自成章。
2、微服务架构有什么优点和缺点?
答:如下
3、什么是SpringCloud?
答:Spring Cloud是一系列框架的有序集合。
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
简而言知SpringCloud就是一组框架的容器,里面包含了Spring公司提供的各种框架,每一个微服务都是一个进程,所以内存条8G以下的小伙伴们要加内存条了哟,因为我到后面动不动就启动8-10个微服务。
4、使用SpringCloud有什么优势?
答:如下
Spring Cloud 来源于 Spring,质量、稳定性、持续性都可以得到保证。
Spirng Cloud 天然支持 Spring Boot,更加便于业务落地。
Spring Cloud 发展非常的快,从 2016 年开始接触的时候相关组件版本为 1.x,到现在将要发布 2.x 系列。
Spring Cloud 是 Java 领域最适合做微服务的框架。
相比于其它框架,Spring Cloud 对微服务周边环境的支持力度最大。
对于中小企业来讲,使用门槛较低。
Spring Cloud 是微服务架构的最佳落地方案。
5、服务注册与发现什么意思?SpringCloud如何实现的?
答:当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理
6、SpringCloud的一些组件介绍?
答:如下
服务治理框架(Dubbo、Eureka、Consul)
分布式配置管理(Disconf、Config)
批量任务框架(Task、LTS)
Spring Cloud Hystrix、Spring Cloud Feign、Spring Cloud Ribbon、Spring Cloud Zuul
7、Zookeeper在项目中的实现及原理?
答:在项目开发中我们常常会有多个项目或者服务需要连接同一个数据库、redis等等,这些地址我们通常是在每一个项目里面有一个xml或者yml、properties 文件维护,这种方式比较直观通用,但是维护方面不太方便,其实配置都一样的,我们可以放到一个统一的配置中心,各个项目只需要访问这个配置中心的节点就行,修改的话也只需要修改配置中心一个节点。zookeeper实现配置中心的机制主要是利用了节点的watch机制。
8、Zookeeper负载均衡和Nginx负载均衡的区别?
答:Nginx是著名的反向代理服务器,也被广泛的作为负载均衡服务器;ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡。
zookeeper
不存在单点问题,zab机制保证单点故障可重新选举一个leader
只负责服务的注册与发现,不负责转发,减少一次数据交换(消费方与服务方直接通信)
需要自己实现相应的负载均衡算法
nginx
存在单点问题,单点负载高数据量大
每次负载,都充当一次中间人转发角色,增加网络负载量(消费方与服务方间接通信)
自带负载均衡算法
9、Zookeeper对节点的watch监听通知是永久的吗?为什么?
答:不是。
官方声明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,这太消耗性能了。
一般是客户端执行getData(“/节点A”,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch事件,就不再给客户端发送。
在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。
10、zk节点宕机如何处理?
答:全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。逐个重启:顾名思义。这是比较常用的方式。
11、为什么要用Dubbo?
答:随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),
也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。就这样为分布式系统的服务治理框架就出现了,Dubbo 也就这样产生了。
12、Dubbo默认使用的是什么通信框架,你是否还有别的选择?
答:Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly。
13、一般使用什么注册中心?谈谈你对过往项目中用到的注册中心的理解?
答:推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。
14、SOA和微服务架构有什么区别?
答:如下
微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个产品,可以独立对外提供服务。
微服务不再强调传统 SOA 架构里面比较重的 ESB 企业服务总线。
微服务强调每个微服务都有自己独立的运行空间,包括数据库资源。
微服务架构本身来源于互联网的思路,因此组件对外发布的服务强调了采用 HTTP Rest API 的方式来进行。
微服务的切分粒度会更小。
总结:微服务架构是 SOA 架构思想的一种扩展,更加强调服务个体的独立性、拆分粒度更小。
15、在使用微服务时,您面临哪些挑战?
答:如下
自动化组件:难以自动化,因为有许多较小的组件。因此,对于每个组件,我们必须遵循Build,Deploy和Monitor的各个阶段。
易感性:将大量组件维护在一起变得难以部署,维护,监控和识别问题。它需要在所有组件周围具有很好的感知能力。
配置管理:有时在各种环境中维护组件的配置变得困难。
调试:很难找到错误的每一项服务。维护集中式日志记录和仪表板以调试问题至关重要。
16、什么是耦合?
答:组件之间依赖关系强度的度量被认为是耦合。一个好的设计总是被认为具有高内聚力和低耦合性。
17、PACT在微服务架构中的用途是什么?
答:PACT 是一个开源工具,允许测试服务提供者和消费者之间的交互,与合同隔离,从而提高微服务集成的可靠性。
用于在微服务中实现消费者驱动的合同。
测试微服务的消费者和提供者之间的消费者驱动的合同。
18、什么是RabbitMQ?
答:采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦。
19、为什么要使用RabbitMQ?
答:如下
在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;
拥有持久化的机制,进程消息,队列中的信息也可以保存下来。
实现消费者和生产者之间的解耦。
对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量
的限流,利于数据库的操作。
可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单
20、请您描述一下使用RabbitMQ的场景?
答:服务间异步通信;顺序消费;定时任务;请求削峰。
21、如何避免消息重复投递或重复消费?
答:在消息生产时,MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id,作为去重的依据(消息投递失败并重传),避
免重复的消息进入队列;
在消息消费时,要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支付 ID、订单 ID、帖子 ID 等)作为去重的依据
避免同一条消息被重复消费。
22、消息基于什么传输?
答:由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接,且每条 TCP 连接上的信道数量没有限制。
23、RabbitMQ的集群?
答:分为主备模式、远程模式、镜像模式、多活模式。
24、什么是kafka?
答:Apache Kafka 是一个分布式发布 - 订阅消息系统。它是一个可扩展的,容错的发布 - 订阅消息系统,它使我们能够构建分布式应用程序。这是一个 Apache 顶级项目。Kafka 适合离线和在线消息消费。
25、如何获取topic主题的列表?
答:bin/kafka-topics.sh --list --zookeeper localhost:2181
26、为什么需要消息系统,mysql不能满足要求吗?
答:如下
解耦
冗余
扩展性
灵活性 & 峰值处理能力
可恢复性
顺序保证
缓冲
异步通信
27、kafka与传统MQ消息系统之间有三个关键区别?
答:如下
Kafka 持久化日志,这些日志可以被重复读取和无限期保留
Kafka 是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过
复制数据提升容错能力和高可用性
Kafka 支持实时的流式处理
28、什么是Hystrix?它如何实现容错?
答:Hystrix从Netflix API团队于2011年开始的弹性工程工作演变而来。在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix是一个库,可通过添加延迟容错和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,阻止它们之间的级联故障以及提供后备选项来实现这一目标,所有这些都可以提高系统的整体弹性。
Hystrix功能:
通过第三方客户端库访问(通常通过网络)依赖关系,以防止和控制延迟和故障。
在复杂的分布式系统中停止级联故障。
快速失败并迅速恢复。
在可能的情况下,后退并优雅地降级。
实现近实时监控,警报和操作控制。
29、什么是 Hystrix断路器?我们需要它吗?
答:hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因此Netflix团队将该框架命名为Hystrix,并使用了对应的卡通形象做作为logo。
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。如果没有采取任何措施的话就会导致雪崩效应。
服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象;
比如A服务调用 B服务,B服务调用C服务,如果C服务出现故障,那么B服务应需调用C服务所以也出现故障 A服务也出现了故障,这就是雪崩效应
如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
30、JVM几个重要的参数?
答:-Xms -Xmx -Xss
31、谈谈你对JVM调优的理解?
答: Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。Java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
32、Java中都有哪些引用类型?
答:分为四种引用;4 种引用的强度依次减弱。
强引用(Strong Reference)
软引用(Soft Reference)
弱引用(Weak Reference)
虚引用(Phantom Reference)
33、Java垃圾回收机制?
答:如下
垃圾回收是由虚拟机自动执行,不能人为地干预。
系统比较空闲(垃圾回收线程)
对象不在被引用.对象处于引用的隔离岛状态(隔离引用),对象具备了回收的条件
gc()方法,可以建议虚拟机执行垃圾回收,但是不能确定是否会执行回收。
由于水平有限,本博客难免有不足;恳请各位大佬不吝赐教!!!