2022-面试题汇总

2023-10-31

1.四大频繁Full GC原因

 1. 大量反射代码使永久代类太多导致频繁Full GC
 解决方案:在有大量反射代码的场景下,只要把-XX:SoftRefLRUPolicyMSPerMB=0,这个参数设置大一些即可,千万别让一些新手同学设置为0,可以设置个100020003000,或者5000毫秒,都可以。提高这个数值,就是让反射过程中JVM自动创建的软引用的一些类的Class对象不要被随便回收,优化这个参数之后,就可以看到系统稳定运行了。
 2. 大对象导致频繁Full GC
 解决方案,一是对SQL语句的处理,不要一次性查表里全部数据,二是给新生代分配更多的空间,毕竟每次到老年代的对象较少而且频率很低,同时给老年代调整了参“XX:CMSInitiatingOccupancyFraction=92”,避免老年代仅仅占用68%就触发GC。
 3. 致命代码:**System.gc()**导致频繁Full GC
 解决方案:一是平时写代码不要用System.gc()去随便触发GC,二是在JVM参数中加入-XX:+DisableExplicitGC,这个参数的意思就是禁止显式执行GC,不允许你来通过代码触发GC。
 4. 内存泄漏引起CPU高负载导致频繁Full GC

2.Redis和MySQL如何保持数据一致性

Cache Aside Pattern旁路缓存模式

1.命中:程序先从缓存中读取数据,如果命中,则直接返回
2.失效:程序先从缓存中读取数据,如果没有命中,则从数据库中读取,成功之后将数据放到缓存中
3.更新:程序先更新数据库,再删除缓存

针对单点数据库,先更新数据库,再删除缓存+延时双删(删除缓存->更新数据->延时->删除缓存)基本没有太大问题。会出现的问题如下(几率很小,因为读一般比写快,写的时候数据库还要加锁之类的,所以慢):
在这里插入图片描述

而实际中,大型项目会有多个数据库集群,比如读写分离情况下,主从架构模式会出现问题。
在这里插入图片描述
在这里插入图片描述
解决方案:多加了一个binlog订阅系统,去订阅主数据库的binlog数据,这样订阅到的数据一定是最新的。实现订阅mysql的binlog日志(一般用单线程,不用担心顺序错乱问题),可以用canal中间件。
还有一种方案:如果读写分离的时候,对数据一致性特别高的模块,可以读取数据的时候,一直去主库查询,因为主库一直是最新的数据。

更新缓存时失败了如何处理:
在这里插入图片描述
加了一个消息队列,可以是MQ或者kafka,将要更新的缓存数据放进MQ中,按顺序放好,消费消息队列时,重新更新缓存。

3.分布式事务

本地事务(数据库事务)
ACID原则
https://blog.csdn.net/u010960184/article/details/82557978

1.undo log
数据库的原子性可以利用undo日志来实现。
Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到Undo Log。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据回复到事务开始之前的状态。
数据库写入数据到磁盘之前,会把数据先缓存在内存中,事务提交时才会写入磁盘重。
如何保证持久性?
事务提交前,会把修改数据写到磁盘前,也就是说只要事务提交了,数据肯定持久化了
2.redo log
和undo log相反,redo log记录的是新数据的备份。在事务提交前,只要将redo log持久化即可,不需要将数据持久化,减少了IO的次数。

在这里插入图片描述
为什么往磁盘写log文件速度快?
写数据的两种方式:随机写,顺序写。

分布式事务:

  • 跨数据源的分布式事务
  • 跨服务的分布式事务
  • 综合情况

跨数据源:随着业务数据规模的快速发展,数据量越来越大,单库单表逐渐成为瓶颈,所以我们对数据库进行了水平拆分,将原单库单表拆分成数据库分片,于是就产生了跨数据库事务问题。
跨服务:按照面向服务(SOA)的架构设计原则,将单业务系统拆分成多个业务系统,降低了各系统之间的耦合度,使不同的业务系统专注于自身业务,更有利于业务的发展和系统容量的伸缩。

解决分布式事务的思路
CAP定理和BASE理论

CAP定理:一个系统无法同时满足以下三点
Consistency:一致性:写操作之后的读操作,必须返回该值(多个服务器数据保持一致)

Availability:可用性:只要收到用户的请求,服务器就必须给出回应(对和错不保证)

Partition tolerance:分区容错性:分区容错的意思就是,区间通信可能失败。比如,一台服务器放在上海,一台服务器放在北京,这就是两个区,他们之间可能因为网络问题无法通信。

要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。

BASE理论

  • Basically Available(基本可用) :分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。举个例子:电商网站交易付款出问题了,商品依然可以正常浏览。
  • Soft state(软状态):由于不要求强一致性,所以BASE允许系统中存在中间状态(也叫软状态),这个状态不影响系统可用性,如订单的“支付中”、“数据同步中”等状态,待数据最终一致后状态改为“成功”状态。
  • Eventually consistent(最终一致性):经过一段时间,所有节点数据都会达到一致。如订单中的“支付中”状态,最终会变成“支付成功”或者“支付失败”,使订单状态与实际交易结果达成一致,但需要一定时间的延迟和等待。

解决方案

  • XA
  • TCC
  • 可靠消息最终一致
  • AT

分阶段提交
分布式事务解决手段之一,就是两阶段提交协议
在这里插入图片描述
二阶段提交:
二阶段提交就是根据这一思想衍生出来的,将全局事务拆分为两个阶段来执行:
阶段一:准备阶段,各个本地事务完成本地事务的准备工作。
阶段二:执行阶段,各个本地事务根据上一阶段执行结果,进行提交或回滚。这个阶段需要一个协调者,还有事务的参与者。协调者会监控各个事务的执行,都成功了才通知各个事务提交。

二阶段提交的问题:

  • 单点故障问题: 协调者挂了,出故障了
  • 数据锁定问题:阻塞问题:在准备阶段,提交阶段,每个事务参与者都会锁定本地资源,并等待其他事务的执行结果,阻塞时间较长,资源锁定时间太久,因此执行的效率就比较低了。

TCC
TCC模式可以解决2PC中资源锁定和阻塞问题,减少资源锁定时间。
基本原理:
它本质是一种补偿的思路。事务运行过程包括三个方法:

  • Try:资源的检测和预留;
  • Confirm:执行的业务操作提交;要求Try成功Confirm一定要能成功;
  • Cancel:预留资源释放

执行分为两个阶段:

  • 准备阶段(try):资源的检测和预留
  • 执行阶段(confirm/cacel):根据上一步结果,判断下面的执行方法。如果上一步所有事务参与者都成功,则执行confirm。反之,执行cancel

粗看似乎和两阶段提交没有什么区别,但其实差别很大:

  • try,confirm,cancel都是独立的事务,不受其他参与者的影响,不会阻塞等待它人
  • try,confirm,cancel由程序员在业务层编写,锁粒度有代码控制
    在这里插入图片描述

优势和缺点
优势
TCC执行的每一个阶段都会提交本地事务并释放锁,并不需要等待其它事务的执行结果。而如果其它事务执行失败,最后不是回滚。而是进行补偿操作。这样就避免了资源的长期锁定和阻塞等待,执行效率较高,属于性能比较好的分布式事务方式。

缺点

  • 代码侵入:需要人为编写代码实现try,confirm,cancel,代码侵入较多
  • 开发成本高:一个业务需要拆分成3个步骤,分别编写业务实现,业务编写比较复杂

使用场景

  • 对事务有一定的一致性要求(最终一致性)
  • 对性能要求较高
  • 开发人员具备较高的编码能力和幂等处理经验

可靠消息服务
这种实现方式的思路,其实是源于ebay,其基本的设计思想是将远程分布式事务拆分成一系列的本地事务。

基本原理
一般分为事务的发起者A和事务的其他参与者B:

  • 事务发起者A执行本地事务
  • 事务发起者A通过MQ将需要执行的事务信息发送给事务参与者B
  • 事务参与者B接收到消息后执行本地事务
    在这里插入图片描述
    如何确保消息收到
    在这里插入图片描述
    以上方式会出现业务耦合,所以采用下面的方式
    在这里插入图片描述
    RocketMQ事务消息
    RocketMQ本身自带了事务消息,可以确保消息的可靠性,原理其实就是自带了本地消息表,与我们上面讲的思路类似

RabbitMQ的消息确认
RabbitMQ确保消息不丢失的思路比较奇特,并没有使用传统的本地表,而是利用了消息的确认机制:
生产者确认机制:确保消息从生产者到达MQ不会有问题

  • 消息生产者发送消息到RabbitMQ时,可以设置一个异步的监听器,监听来自MQ的ACK
  • MQ接收到消息后,会返回一个回执给生产者:消息到达交换机后路由失败,会返回失败ACK;消息路由成功,持久化失败,会返回失败ACK;消息路由成功,持久化成功,会返回成功ACK
  • 生产者提前编写好不同回执的处理方式:失败回执:等待一定时间后重新发送;成功回执:

消费者确认机制:确保消息能够被消费者正常消费

  • 消费者需要在监听队列的时候指定手动ACK模式
  • RabbitMQ把消息投递给消费者后,会等待消费者ACK,接收到ACK后才删除消息,如果没有接收到ACK,消息会一直保留在服务端,如果消费者断开连接或异常后,消息会投递给其他消费者
  • 消费者处理完消息,提交事务后,手动ACK。如果执行过程中抛出异常,则不会ACK,业务处理失败,等待下一条消息

经过上面的两种确认机制,可以确保从消息生产者到消费者的消息安全,再结合生产者和消费者两端的本地事务,即可保证一个分布式事务的最终一致性。

消息事务的优缺点
总结上面几种模型,消息事务的优缺点如下:
优点:

  • 业务相对简单,不需要编写三个阶段业务
  • 是多个本地事务的结合,因此资源锁定周期短,性能好
    缺点:
  • 代码侵入
  • 依赖于MQ的可靠性
  • 消息发起者可以回滚,但消息参与者无法引起事务回滚
  • 事务时效性差,取决于MQ消息发送是否及时,还有消息参与者的执行情况。

AT模式
AT模式是一种无侵入的分布式事务解决方案。可以看作是对TCC或者二阶段提交模型的一种优化,解决了TCC模式中的代码侵入,编码复杂等问题。
在AT模式下,用户只需要关注自己的业务SQL,用户的业务SQL作为一种阶段,Seata框架会自动生产事务的二阶段提交和回滚操作。

在这里插入图片描述
有没有感觉跟TCC的执行很想,都是分两个极端:

  • 一阶段:执行本地事务,并返回执行结果
  • 二阶段:根据一阶段的结果,判断二阶段做法:提交或回滚

但AT模式底层做的事情可完全不同,而且第二阶段根本不需要我们编写,全部由Seata自己实现。也就是说:我们写的代码与本地事务时代码一样,无需手动处理分布式事务。

如何实现
一阶段:
在一阶段,Seata会拦截“业务SQL”,首先解析SQL语义,找到业务SQL要更新的业务数据,在业务数据被更新前,将其保存成before image,然后执行业务sql,更新业务数据,在业务数据更新之后,再将其保存成after image,最后获取全局行锁,提交事务。以上操作全部在一个数据库事务内完成,这样保障了一阶段操作的原子性。

这里的before image和after image类似于数据库的undo 和 redo日志,但其实是用数据库模拟的。

二阶段提交:
二阶段如果是提交的话,因为业务sql在一阶段已经提交至数据库,所以Seata框架只需要将一阶段保存的快照数据和行锁删除掉,完成数据清理即可

二阶段回滚:
二阶段如果是回滚的话,Seata就需要回滚一阶段已经执行的业务sql。还原业务数据。回滚方式便是用before image还原业务数据;但在还原前首先要校验脏写,对比数据库当前业务数据和 after image。如果两份数据完全一致,就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理。

详细架构和流程
Seata中的几个基本概念:

  • TC(Transaction Coordinator)-事务协调者
    维护全局和分支事物的状态,驱动全局事务提交或回滚(TM之间的协调者)

  • TM(Transaction Manager)-事务管理者
    定义全局事务的范围:开始全局事务,提交或回滚全局事务

  • RM(Resource Manager)-资源管理器
    管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚
    在这里插入图片描述
    TM:业务模块中全局事务的开启者

  • 向TC开启一个全局事务

  • 调用其他微服务

RM:业务模块执行者中,包含RM部分,负责向TC汇报事务执行状态

  • 执行本地业务
  • 向TC注册分支事务,并提交本地事务执行结果

TM:结束对微服务的调用,通知TC,全局事务执行完毕,事务一阶段结束
TC:汇总各个分支事务执行结果,决定分布式事务是提交还是回滚
TC通知所有RM提交/回滚资源,事务二阶段结束

实操
1.搭建一个TC服务,事务的协调者,负责各个事务的通信
(在官方网站下载TC Server)
2.在每个事务的参与者中引入RM/TM的包
3.告知每个事务的参与者,TC的地址
4.标记事务的范围(将Transactional注解改为GlobalTransactional)
5.代理数据源(拦截mybatis的数据进行处理)

四,谈谈你对SpringCloud的理解

Spring cloud是一个基于Spring Boot实现的服务治理工具包,用于微服务架构中管理和协调各个服务的。
它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。

由于是微服务架构,由多个单体项目组成,就会有各自的通信地址,所以我们用服务发现注册Eureka来管理通信地址,配置中心config来管理配置文件并放到gitee上去保存,服务发现注册包含了服务端EurekaServer和客户端EurekaClient,(可以讲心跳机制),微服务EurekaServer在启动时会将通信地址发给注册中心EurekaClient,形成通信列表,也就是服务注册;微服务从注册中心获取一份微服务通信地址,自己向别的微服务通过通信地址找到的该微服务通信地址基于HTTP发起请求叫做服务发现;

当有多个微服务时,根据业务需求可能会有多个服务者,也就是功能一样的两个模块。需要对他们发起的请求进行处理,所以我们需要负债均衡负载均衡Ribbon,通过负载均衡来控制请求的分发,负载均衡常用算法有轮询(公平,两个都一样),随机,加权轮询(哪个厉害点就多给点,能者多劳)。

但是一个服务出现延迟时,所有的请求都阻塞在依赖的服务,高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险也就是雪崩,所以我们需要用到断路器Hystrix,将出现问题的服务通过熔断、降级等手段隔离开来,这样不影响整个系统的主业务,所以维护起来更方便。具体方式有:资源隔离(线程池隔离和信号量隔离),熔断(熔断,半熔断,闭合),降级(服务熔断后返回一个预先设定好的托底数据);

当服务都能正常运行时,我们不能让所有都来访问,要有一个保安来拦截不该进来的请求,比如爬虫和其余不合法的请求,所以我们用到了服务网关Zuul,zuul还能自定义过滤器,比如自定义一个accesstoken,不带accesstoken的不让访问。有效的保证了服务的安全性。

五,MYSQL优化 索引

https://blog.csdn.net/CSDN2497242041/article/details/120558219

六,MYBATIS一二级缓存

https://blog.csdn.net/guorui_java/article/details/118095020

七,类加载机制

https://blog.csdn.net/qq_34416191/article/details/117927553

八,Spring Bean的生命周期

https://baijiahao.baidu.com/s?id=1666448276232778855&wfr=spider&for=pc

SpringBean的生命周期,大致可以分为五个阶段。分别是 创建前准备,创建实例化,依赖注入,容器缓存,销毁实例。

  • 创建前准备:Bean在开始加载之前,要从上下文和一些配置中,去解析并且查找Bean有关的扩展实现,比如像“init-method”:容器在初始化Bean的时候,会调用的方法。destory method:容器在销毁的时候会调用的一些方法,以及BeanFactoryPostProcessor这一类的Bean加载过程中的前置和后置的一些处理扩展实现。这些类或者配置,其实是Spring提供给开发者用来去实现Bean加载过程中的一些扩展.
  • 创建实例化阶段:这个阶段的主要作用是通过反射去创建Bean的实例对象,并且会扫描和解析Bean声明的一些属性。
  • 依赖注入阶段:如果被实例化的Bean存在依赖其他Bean对象的情况,则需要对这些依赖的Bean进行对象注入,比如常见的@Autowired以及setter注入等,同时在这个阶段会触发一些扩展的调用,比如说常见的扩展类BeanPostProcessors用来去实现Bean初始化前,后的扩展回调。以及像BeanFactoryAware等等
  • 容器缓存阶段:主要作用是把Bean保存到容器以及Spring的缓存中,到这个阶段Bean就可以被开发者去使用了,这个阶段涉及到的操作,常见的像inti-method:这个属性配置的一些方法会在这个阶段被调用。以及像BeanPostProcessors的后置处理器方法也会在这个阶段被触发
  • 销毁实例阶段:当Spring的应用上下文被关闭的时候,那么这个上下文中所有的Bean会被销毁。如果存在Bean实现了DisposableBean接口或者配置了destory-method属性的一些方法会在这个阶段被调用。

九,常见设计模式

https://zhuanlan.zhihu.com/p/248493266

十,redis分布式锁

https://blog.csdn.net/weixin_46122805/article/details/115791088

十一,Spring中事务的传播行为

首先所谓的事务传播行为是多个声明事务的方法,相互调用的时候,这个事务应该如何去传递。在Spring中有七种事务传播行为。
第一个是required,它是spring里面默认的事务传播行为,也就是说如果当前存在事务,就加入到这个事务里面去执行。如果不存在事务就新建一个事务。第二个是require_new,她不管说是否存在事务。它都会新开启一个事务来执行。新老事务是相互独立的。外部事务抛出异常,并不会影响内部事务的一个正常提交。第三个是nested,就是如果当前存在事务,就嵌套在当前事务中去执行。如果当前没有事务,那么就新建一个事务,类似require_new这样的传播行为。第四个是supports表示支持当前的事务,如果当前不存在事务,就以非事务的方式去执行。第五个是not support,它表示以非事务的方式来运行。如果当前存在事务,就需要把当前的事务挂起来。第六个是mandatory,它是一个强制的事务执行,就是如果当前不存在事务,就抛出一个异常。第七个是never,就是以非事务的方式去执行,如果当前存在事务,则抛出异常。Spring中的传播级别是一般不需要去定义的,默认就是required,除非是在嵌套的事务的情况下,需要去重点的了解。

嵌套回滚:https://www.cnblogs.com/yaowen/p/12579888.html

事务失效

@Transactional
public String insertUser(UserEntity userEntity) {
	try{
		userMapper.insertUser(userEntity);
		int j = 1/0;
} catch (Exception e) {
	// 此时事务注解失效,因为catch了异常,AOP容器捕获不到,不会回滚。
TransactionAspectSupport.currentTransactionStatuc().setRollbackOnly(); // 此时用此代码手动回滚;
}
}

12,rabbitMQ队列模式

https://blog.csdn.net/weixin_38361347/article/details/119057415

13,mysql索引优化

14,linux常用指令

https://blog.csdn.net/Java___interview/article/details/120780629

15, == 和 equals的区别

==比较的是栈中的值(基本数据类型比较变量值,引用类型比较堆中内存对象的地址)

16.final

1.简述final的作用
最终的:

  • 修饰类:表示类不可被继承
  • 修饰方法:表示方法不可被子类覆盖,但可以重载
  • 修饰变量:表示变量一旦被赋值就不可以更改它的值
    (1).修饰成员变量:
  • 如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值
  • 如果final修饰的时成员变量,可以在非静态初始化块,声明该变量或者构造器中执行初始值。
    (2).修饰局部变量
    系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化,因此使用final修饰局部变量时,即可以在定义时指定默认值(后面的代码不能对变量赋值),也可以不指定默认值,而在后面的代码中对final变量赋初值(仅一次)
    (3)修饰基本类型数据和引用类型数据
  • 如果是基本数据类型,则其数值一旦在初始化后便不能修改
  • 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但是引用的值是可变的

2.为什么局部内部类和匿名内部类只能访问局部final变量?
首先需要知道的一点是:内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕就被销毁。
这里就会产生问题:当外部类的方法结束时,局部变量就会被销毁,但是内部类对象可能还存在(只有没有人再引用它时,才会死亡)。这里就出现了一个矛盾:内部类对象访问了一个不存在的变量,为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡后,内部类仍然可以访问它,实际访问的是局部变量的“copy”。这样就好像延长了局部变量的生命周期。

将局部变量复制为内部类的成员变量时,必须保持这两个变量是一样的,也就是如果我们再内部类中修改了成员变量,方法中的局部变量也得跟着改变,怎么解决问题呢?

就将局部变量设置为final,对它初始化后,我就不让你再去修改这个变量,就保证了内部类的成员变量和方法的局部变量的一致性。

17.String,StringBuffer,StringBuilder区别及使用场景

  • String是final修饰的,不可变,每次操作都会产生新的String对象
  • StringBuffer和StringBuilder都是在原对象上操作
  • StringBuffer是线程安全的,StringBuilder线程不安全
  • StringBuffer的方法都是synchronized修饰的
  • 性能:StringBuilder>StringBuffer>String

场景:经常需要改变字符串内容时使用后面两个
优先使用StringBuilder,多线程使用共享变量时使用StringBuffer

18,重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时
重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。如果父类方法访问修饰符为private则子类就不能重写该方法。

19,接口和抽象类的区别

  • 抽象类可以存在普通成员函数,而接口中只能存在public abstract方法(除去default方法)
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
  • 抽象类只能继承一个,接口可以实现多个

接口设计的目的,是对类行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。

而抽象类的设计目的,是代码服用。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象累。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各子类自己实现。正是因为A-B在这里没有实现,所以抽象类不允许实例化出来(否则当调用到A-B时,无法执行)。

抽象类对类本质的抽象,表达的是is a的关系,比如: BMW is a Car。抽象类包含并实现子类的通用特性,将子类存在差异化的特性进行抽象,交由子类去实现.

而接口是对行为的抽象,表达的是like a的关系。比如: Bird like a Aircraft(像飞行器一样可以飞),但其本质上is a bird。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁,是如何实现的,接口并不关心

使用场景:当你关注一个事务的本质的时候,用抽象类。当你关注一个操作的时候,用接口。

抽象类的功能要远超过接口,但是定义抽象类的代价高。因为每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度。

20,SpringBoot自动配置

SpringBoot启动流程的简化版代码

public static void run(Class<?> primaryClass) {
// 1.创建一个ApplicationContext实例,即我们常说的IOC容器
ApplicationContext context = createApplicationContext();
// 2.将主类(primaryClass)注册到IOC容器中(简单但重要的第一步)
loadSourceClass(context,primaryClass);
// 3.递归加载并处理所有的配置类
processConfigurationClasses(context);
// 4.实例化所有单例Bean(Singleton Bean)
instantiateSingletionBeans(context);
// 5.如果是Web应用,则启动Web服务器(例如Tomcat)
startWebServer(context);
}

在这里插入图片描述
在这里插入图片描述

21,Springboot的四种启动方式

  1. 主启动类直接启动
  2. 利用springboot的maven插件运行 mvn spring-boot:run 进行启动
  3. 打成jar包,利用 java -jar 运行jar包
  4. 利用docker制作镜像运行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2022-面试题汇总 的相关文章

  • 不支持的字段:将瞬间格式化为日期 ISO 时的年份[重复]

    这个问题在这里已经有答案了 我正在尝试将 Instant 格式化为 ldap 日期 ISO8601 但在 f format Instant now 处失败 String input 20161012235959 0Z DateTimeFor
  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • Maven WebApp META-INF context.xml

    我正在使用 Maven 3 并且尝试在 webapp 文件夹下添加 META INF 文件夹 所以我正在尝试执行以下操作 src main webapp META INF context xml WEB INF 下面是我的 POM 文件
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • 了解Kafka流groupBy和window

    我无法理解 kafka 流中的 groupBy groupById 和窗口的概念 我的目标是聚合一段时间内 例如 5 秒 的流数据 我的流数据看起来像 value 0 time 1533875665509 value 10 time 153
  • 接口是否像对象一样对待?

    为什么下面的代码可以工作 interface I class A implements I public String toString return in a class B extends A public String toStrin
  • 如何在 spring-data 中强制使用 CrudRepository 进行预加载?

    我有一个实体 其中包含List就是这样lazy默认加载 interface MyEntityRepository extends CrudRepository
  • Hibernate 标准接受 %% 值

    我正在使用下面的 Hibernate 代码来过滤workFlowName crt add Restrictions like workFlowName workFlow MatchMode ANYWHERE crt is the crite
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

    我正在尝试访问第三方 Web 服务 该服务要求我创建一个传递时间信息 用户名和密码的安全标头 我在网上搜索了可行的示例 并尝试了多种方法 我正在尝试使用 Java 6 中内置的内容来做到这一点 我不确定我做错了什么 从 WSDL 生成 We
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐

  • 判断当前日期是否在[startDate, endDate]区间

    原文地址 http www cnblogs com linjiqin p 5569601 html 判断当前日期是否在 startDate endDate 区间 param startDate 开始日期 param endDate 结束日期
  • C语言实现输出九九乘法表

    代码如下 include
  • Jmeter之设置用户token为全局变量(超详细,保证你会)

    1 打开jmeter之后新增一个线程组 路径 Test Plan Add Theads user Thread Group 2 添加了线程组之后 在线程组下面添加一个sampler 取样器 就是HTTP request 3 在http请求里
  • 程序员应该掌握的10个搜索技巧

    程序员应该掌握的10个搜索技巧 txt 程序员应该掌握的10个搜索技巧 txt Google搜索 1 准确搜索 2 排除关键词 3 用 Either OR 或 逻辑进行搜索 4 同义词搜索 5 在站内进行搜索 6 善用星号 7 在两个数值之
  • java log 封装_工具类之LogUtils

    安卓开发离不开记录log日志 封装了一份简单的日志工具类 具有设置日志总开关 是否写入文件 日志过滤器和自定义标签 锁定打印log的类 函数名及行号 初始化有可以使用init函数也可以使用建造者模式 具体使用参看单元测试 站点 init 初
  • 在ubuntu下安装VScode,配置PCL文件库问题

    安装过程直接忽略 可以在官网直接下载安装 Download Visual Studio Code Mac Linux Windows 安装完成后在桌面新建一个文件夹和一个 cpp文件 右键文件夹 选择使用VScode打开 安装中文包 安装C
  • 华为OD2023(A卷)基础题26【最大利润、贪心的商人】

    题目 最大利润 商人经营一家店铺 有number种商品 由于仓库限制每件商品的最大持有数量是item index 每种商品的价格是item price item index day 通过对商品的买进和卖出获取利润 请给出商人在days天内能
  • qcharts控件如何提升

    条件 qt5 9版本以后 编译器也要对应的新版本 否则无法释放该版本qt库的所有功能 已经下载了qtcharts模块 如果安装qt时候没有勾选 则打开安装目录的MaintenanceTool exe软件 重新将qtcharts模块勾选上安装
  • R-Drop和SimCSE解读

    R Drop Regularized Dropout for Neural Networks R Drop的基本思想是 同一个step里面 对于同一个样本 前向传播两次 由于Dropout的存在 会得到两个不同但差异很小的概率分布 通过在原
  • JavaScript中远程级联调用(RPC)java对象中的方法并返回结果

    http code google com p json rpc for java downloads list
  • 如何修改服务器远程端口

    1 开始 运行 regedit 2 依次展开 HKEY LOCAL MACHINE SYSTEM CURRENTCONTROLSET CONTROL TERMINAL SERVER WDS RDPWD TDS TCP 右边键值中 PortN
  • Stm32f030 双串口

    void USART INIT void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitStructure NVIC InitTypeDef NVIC Ini
  • Ubuntu 安装 conda

    下载 Anaconda 进入 Ubuntu 自己新建下载路径 输入以下命令开始下载 注意 如果不是 x86 64 需要去镜像看对应的版本 https mirrors bfsu edu cn anaconda archive C M O A
  • (十三)CMake MESSAGE和PROJECT

    一 MESSAGE MEESSAGE的功能是记录一个信息 当我们执行 编译 含有message命令的代码时 将会在终端打印指定内容 如果超过一个信息字符串 它将会拼接成一个信息 无缝连接 MESSAGE报告的信息可以是 普通信息 报告检查信
  • android手机安装ubuntu并创建ubuntu图形界面(1)

    在安卓手机上安装Ubuntu并创建图形界面 1 下载termux 用手机直接打开网址Termux F Droid Free and Open Source Android App Repository 点击下载apk并安装 安装后启动界面如
  • Scrapy运行builtins.ImportError: No module named 'win32api'

    windows 下 安装好scrapy后 运行 scrapy bench 报错builtins ImportError No module named win32api 解决方法 pip install pypiwin32
  • 关于自搭网站XAMPP(一)前后端AJAX-PHP数据连通

    前端AJAX代码
  • DEDECMS如何将图片轮播做到后台控制

    网上找了一大堆 试了好多方法 都不管用 最后偶尔看到这几行代码 没想到成功了 然后自己做个总结 方法如下 直接建立一个顶级栏目 然后在该顶级栏目里添加文档 在文档里面只上传缩略图 不要添加内容 然后在模板页面调用下面的代码标签 就好啦 把下
  • CRC32爆破小结

    前言 最近在bugku遇到了一道隐写题 binwalk之后发现里面有很多个压缩包 然后就无从下手 于是查看别人大佬的wp才发现是CRC32爆破 由于本人第一次遇到这种题目 就记录一下吧 正文 CRC想必大家都知道 它的全称是循环冗余校验 C
  • 2022-面试题汇总

    1 四大频繁Full GC原因 1 大量反射代码使永久代类太多导致频繁Full GC 解决方案 在有大量反射代码的场景下 只要把 XX SoftRefLRUPolicyMSPerMB 0 这个参数设置大一些即可 千万别让一些新手同学设置为0