springboot面试题:
事务机制:
事务的特性(ACID)
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
事务并发导致的问题:
脏读(Dirty reads)——脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
不可重复读(Nonrepeatable read)——不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新。
幻读(Phantom read)——幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录。
5)解决读问题:设置事务的隔离级别
未提交读:脏读,不可重复读,虚读都有可能发生
已提交读:避免脏读。但是不可重复读和虚读都有可能发生
可重复读:避免脏读和不可重复读。但是虚读有可能发生
串行化的:避免以上所有读问题
mysql数据库的默认隔离级别就是可重复读,Oracle默认是已提交读
常见的设计模式
1、模板模式:
父类实现基本的骨架,子类重写方法后在一些个性化的模块中添加自己独有的逻辑处理
2、观察者模式:
将观察者和被观察者之间做出了解耦,观察者不会影响被观察者的现有逻辑
例如统计客户消费次数时,当客户支付成功会调用spring的事件机制“支付成功事件”,同时向观察者收到“客户支付成功”,会执行“统计消费次数模块”逻辑。
3、外观设计模式:
对外提供统一接口,隐藏内部细节,降低使用者的复杂度
4、装饰器设计模式:
对原有类的功能做增强,但又不想增加过多子类
5、单例模式:
懒汉模式下是线程不安全的
对 getInstance() 方法加锁,那么在一个时间点只能有一个线程能够进入该方法,从而避免了实例化多次 :::性能不好,容易线程阻塞
先判断是否已经实例化(第一次实例化可能还是会有阻塞问题)
饿汉模式下线程安全的
6、原型模式
使用@Scope注解,将其声明为原型bean
7、代理模式
AOP指的是面向切面编程,定义一个切面,用切面去切相应的方法,就可以织入相关的逻辑。面向切面编程使用代理模式(拦截器是aop的一种实现,)
1、什么是 Spring Boot?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重xml的配置,提供了各种启动器,在运行过程中自定配置, 开发者能快速上手。
2、为什么要用 Spring Boot?
Spring Boot 优点非常多,如:
独立运行 简化配置 自动配置 无代码生成和XML配置 无需部署war文件
3、Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景:
使用SpringCloudConfig配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密/解密的场景;
5、SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
11、你如何理解 Spring Boot 中的 Starters?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
12、如何在 Spring Boot 启动的时候运行一些特定的代码?
可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法,具体请看这篇文章《Spring Boot Runner启动器》。
13、Spring Boot 有哪几种读取配置的方式?
Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量,具体请看这篇文章《Spring Boot读取配置的几种方式》。
读取application文件
info.address=USA
info.company=Spring
info.degree=high
1、@Value注解
直接获取application文件中的数据
@Component
public class InfoConfig1 {
@Value("${info.address}")
private String address;
2、@ConfigurationProperties注解读取方式
以类的形式接受application文件中的数据
@Component
@ConfigurationProperties(prefix = "info")
public class InfoConfig2 {
private String address;
private String company;
private String degree;
3、读取指定文件
资源目录下建立config/db-config.properties:
db.username=root
db.password=123456
@PropertySource指定资源文件路径+@Value注解读取文件数据(@PropertySource不支持yml文件读取。)
@PropertySource+@ConfigurationProperties注解读取方式(同第二点)
@Component
@PropertySource(value = { "config/db-config.properties" })
public class DBConfig1 {
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
18、Spring Boot 可以兼容老 Spring 项目吗,如何做?
可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。