spring boot启动原理
首先由@SpringBootApplication注解启动,而@SpringBootApplication由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解构成
@EnableAutoConfiguration最为核心,在启动时就会导入自动配置AutoConfigurationlmportSelector类,将所有符合条件的@Configuration配置进行加载。
@SpringBootConfiguration等价于@Configuration,将这个类标记为配置类会被加载到容器中。
@ComponentScan:自动扫描并加载符合条件的Bean
然后就是进行mian方法的run运行,启动包含以下四个步骤:服务构建、环境准备、容器创建、填充容器。
- 加载Spring Boot应用程序的启动类:Spring Boot应用程序的入口是一个带有
main
方法的Java类。在这个类中,我们使用@SpringBootApplication
注解标记启动类,该注解包含了@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
等注解。这些注解用于指定Spring Boot应用程序的配置、自动配置和组件扫描。 - 创建Spring应用程序上下文:在启动类中,通过调用
SpringApplication.run()
方法来创建Spring应用程序上下文。这个方法会加载并初始化所有的Spring组件,并完成各种自动配置。 - 执行自动配置:Spring Boot利用自动配置机制简化了Spring应用程序的配置过程。自动配置是通过在类路径下查找特定的配置类来实现的,这些配置类根据应用程序的依赖关系自动配置各种功能和组件。
- 启动内嵌的Servlet容器:Spring Boot可以内嵌Servlet容器,如Tomcat、Jetty或Undertow,以简化Web应用程序的部署过程。在启动过程中,Spring Boot会根据类路径中的依赖关系自动配置并启动内嵌的Servlet容器。
- 运行应用程序:一旦内嵌的Servlet容器成功启动,Spring Boot就会运行应用程序。这意味着你的应用程序已经可以响应来自客户端的请求。
总结起来,Spring Boot的启动流程可以概括为:加载启动类 -> 创建应用程序上下文 -> 执行自动配置 -> 启动内嵌的Servlet容器 -> 运行应用程序。通过这个流程,Spring Boot能够快速、方便地启动和运行应用程序,并提供丰富的自动配置功能。
spring boot常用注解
@SpringBootApplication
:这是一个组合注解,用于标记Spring Boot应用程序的启动类。它包含了@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
等注解,用于指定应用程序的配置、自动配置和组件扫描。@RestController
:这个注解用于标记一个控制器类,表示该类中的方法返回的是RESTful风格的响应。@RequestMapping
:这个注解用于映射HTTP请求到控制器方法。可以用于类级别和方法级别,指定请求的URL路径、请求方法和其他参数。@Autowired
:这个注解用于自动装配(依赖注入)Spring容器中的Bean。它可以用于构造函数、属性和方法上。@Component
:这个注解用于标记一个普通的Spring组件类,表示它会被Spring自动扫描并纳入容器管理。@Service
:这个注解用于标记一个服务类,通常用于业务逻辑层。@Repository
:这个注解用于标记一个数据访问层(DAO)类,表示它是一个数据库访问组件。@Configuration
:这个注解用于标记一个配置类,表示它包含了一个或多个Bean的定义。@EnableAutoConfiguration
:这个注解用于启用Spring Boot的自动配置机制,它会根据类路径上的依赖自动配置Spring应用程序。@Value
:这个注解用于注入配置属性值,可以用于字段、方法参数和方法返回值。@Conditional
:这个注解用于根据条件来决定是否创建一个Bean,可以根据配置、环境变量或其他条件进行条件化的Bean创建。
MySQL底层试题
- MySQL的存储引擎有哪些?它们有什么区别? 答:MySQL的存储引擎包括InnoDB、MyISAM、Memory、CSV等。它们之间的区别主要在于事务支持、并发性能、数据缓存、索引方式等方面。其中,InnoDB是MySQL的默认存储引擎,支持事务和行级锁定,适合于事务处理和并发性能要求较高的场景。而MyISAM不支持事务,但具有较高的插入和查询速度,适合于读写分离和大量查询的场景。
- 索引是什么?MySQL中的索引有哪些类型? 答:索引是一种数据结构,用于加快数据库查询操作的速度。MySQL中常见的索引类型包括B-tree索引、哈希索引、全文索引等。其中,B-tree索引是最常用的索引类型,适用于范围查询和排序。哈希索引适用于等值查询,但不支持范围查询和排序。全文索引用于全文搜索,可以实现对文本内容的高效检索。
- MySQL的查询优化器是什么?它的作用是什么? 答:MySQL的查询优化器是一个模块,负责根据查询语句的执行计划选择最优的执行方式。它的作用是通过分析查询语句、表结构、索引等信息,生成最佳的查询计划,提高查询性能。查询优化器会考虑多种因素,如索引选择、表连接顺序、子查询优化等,以尽可能减少查询的成本和执行时间。
- MySQL的事务隔离级别有哪些?它们有什么区别? 答:MySQL的事务隔离级别包括读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。它们的区别主要体现在并发操作的可见性和数据一致性上。读未提交允许一个事务读取另一个事务尚未提交的数据,可能会导致脏读。读提交保证一个事务只能读取已经提交的数据,避免了脏读,但可能会出现不可重复读。可重复读保证一个事务在执行期间看到的数据保持一致,避免了脏读和不可重复读。串行化是最高级别的隔离级别,通过强制事务串行执行来避免并发问题,但会影响并发性能。
- MySQL的主从复制是什么?它的作用是什么? 答:MySQL的主从复制是指将一个数据库的数据变更同步到其他数据库的过程。在主从复制中,有一个主数据库(Master)负责接收和处理数据变更,其他从数据库(Slave)根据主数据库的日志进行数据复制。主从复制可以实现数据的备份、读写分离和提高系统的可用性和性能。
redis底层面试必答题
- Redis的数据结构有哪些?它们的特点和应用场景是什么? 答:Redis支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)和位图(Bitmap)等。每种数据结构都有其特点和应用场景,例如字符串适用于缓存、计数器等简单值的存储;哈希适用于存储对象或实体的属性;列表适用于队列、栈等数据结构;集合适用于唯一值的存储和集合运算;有序集合适用于排序和排行榜;位图适用于位运算和统计等场景。
- Redis的持久化机制有哪些?它们的区别是什么? 答:Redis提供了两种持久化机制:RDB(Redis Database)和AOF(Append Only File)。
- RDB是一种快照机制,将数据库的状态定期保存到磁盘上的二进制文件中。它具有高效的恢复速度和较小的文件大小,适合用于备份和灾难恢复。
- AOF是一种日志追加机制,将写操作以追加的方式记录到文件中。它具有更好的数据完整性和故障恢复能力,适合用于持久化关键数据和实现高可用性。
- Redis的事件驱动模型是什么?它的作用是什么? 答:Redis采用事件驱动模型来处理客户端请求和内部操作。在事件驱动模型中,Redis使用单个线程来处理所有的请求和操作,并通过事件循环(Event Loop)来驱动整个过程。事件驱动模型使得Redis能够高效地处理大量的并发连接和请求,同时保持低延迟和高吞吐量。
- Redis的缓存淘汰策略有哪些?它们的区别是什么? 答:Redis提供了多种缓存淘汰策略,常见的包括LRU(Least Recently Used)、LFU(Least Frequently Used)、Random(随机)和TTL(Time to Live)等。
- LRU策略基于最近使用的原则,淘汰最近最少使用的数据。
- LFU策略基于最不经常使用的原则,淘汰使用频率最低的数据。
- Random策略是随机淘汰数据。
- TTL策略基于数据的过期时间,淘汰已过期的数据。 这些策略各有优缺点,选择合适的策略取决于具体的应用场景和需求。
- Redis如何保证数据的高可用性和容错性? 答:Redis通过主从复制和Sentinel(哨兵)机制来实现数据的高可用性和容错性。
- 主从复制是通过将主节点的数据复制到多个从节点来实现。主节点负责写操作,从节点负责读操作,当主节点故障时,从节点可以自动切换为主节点,保证数据的可用性。
- Sentinel是一个用于监控和管理Redis实例的分布式系统,它可以自动检测主节点的故障,并进行故障转移,选举新的主节点。 通过主从复制和Sentinel机制,Redis能够实现故障恢复和数据的高可用性。
Spring Boot中AOP(面向切面编程)的面试题:
- 什么是AOP?在Spring Boot中如何实现AOP? 答:AOP(Aspect-Oriented Programming)是一种编程范式,通过将横切关注点(如日志记录、事务管理等)从业务逻辑中剥离出来,以切面(Aspect)的方式进行统一管理和复用。在Spring Boot中,可以使用AspectJ注解或Spring的AOP框架来实现AOP。Spring的AOP框架基于动态代理机制,通过在运行时动态地创建代理对象,实现对目标方法的增强。
- 在Spring Boot中,如何定义切面和切点? 答:在Spring Boot中,可以使用
@Aspect
注解来定义切面,通过在切面类中的方法上使用@Before
、@After
、@Around
等注解来定义切点。切点是一个匹配目标方法的表达式,可以使用@Pointcut
注解来定义。 - Spring Boot的AOP支持哪些类型的通知(Advice)? 答:Spring Boot的AOP支持以下类型的通知:
- 前置通知(Before Advice):在目标方法执行前执行。
- 后置通知(After Advice):在目标方法执行后执行,无论方法是正常返回还是异常终止。
- 返回通知(After Returning Advice):在目标方法正常返回后执行。
- 异常通知(After Throwing Advice):在目标方法抛出异常后执行。
- 环绕通知(Around Advice):包围目标方法的执行,可以在方法前后进行增强处理。
- 在Spring Boot的AOP中,什么是连接点(Join Point)、切点(Pointcut)和通知(Advice)? 答:连接点是在应用程序执行过程中能够插入切面的点,通常是方法的调用或异常处理。切点是一组连接点的集合,它定义了切面所关注的具体连接点。通知是切面在切点处执行的动作,可以是前置通知、后置通知、返回通知、异常通知或环绕通知。
- Spring Boot的AOP和传统的面向对象编程有什么区别? 答:传统的面向对象编程主要关注类、对象和继承等概念,而AOP关注的是横切关注点的抽象和模块化。AOP通过切面将横切关注点从业务逻辑中剥离出来,并以模块化的方式进行管理和复用,提高了代码的可维护性和可扩展性。相比传统的面向对象编程,AOP更加关注系统的整体架构和横向的共享功能。