SpringBoot的启动原理?
1.运行Main方法: 应用程序启动始于Main方法的执行。在Main方法中,创建了一个SpringApplication实例,用于引导应用程序的启动。同时,SpringApplication会根据spring.factories记录加载并注册监听器、ApplicationContextInitializer等扩展接口实现。
应用程序启动的入口。在这一步,Spring Boot会 启动Spring进而创建内置tomcat,进去run方式后还做了很多其他事:就是2.运行run方法: 运行SpringApplication的run方法
3. Spring Boot会读取和解析环境变量、配置文件(如application.properties或application.yml)等,以获取应用程序的调整信息。
4.之后再创建ApplicationContext也就是我们熟知的Spring上下文: 在这一步,Spring Boot会根据应用程序的类型(例如,Web应用程序)创建相应的ApplicationContext。对于Web应用程序,通常创建的是ServletWebServerApplicationContext。
5.预初始化上下文: Spring Boot会将启动类作为安装类,读取并注册为BeanDefinition,这使得Spring容器能够识别应用程序的配置。
6.调用refresh: 此时,Spring Boot调用了refresh办法来加载和初始化Spring容器。在这一过程中,会执行一系列操作,包括解析@Import注解以加载自动配置类,创建和注册BeanDefinition等。
通过7.创建内置servlet容器: 如果应用程序是一个Web应用程序,Spring Boot会在这一步创建内置的servlet容器(例如Tomcat),以便应用程序可以接受HTTP请求。这个容器将被Spring Boot自动配置,并且能够通过部署进行自定义。
8.监听器和扩展点: 在整个启动过程中,Spring Boot会调用各种监听器和扩展点,这些组件可以用来对应用程序进行扩展和定制。例如,您可以使用监听器来处理应用程序启动和关闭事件,或者使用ApplicationContextInitializer来自定义ApplicationContext的初始化。
总的来说,Spring Boot的启动过程是一个困难的流程,它从Main方法开始,经过一系列步骤来初始化Spring容器和启动内置tomcat。
介绍下SpringAop的底层达成?
答:参考答案:
Spring AOP 凭借 JDK 动态代理 或 CGLIB 动态代理 创建代理对象,并结合 拦截器链 实现通知逻辑的增强,最终在不修改目标类的情况下实现横切关注点的分离。
动态代理:
● JDK 动态代理:目标类实现接口时使用,基于Proxy
和InvocationHandler
。
● CGLIB 动态代理:目标类未完成接口时使用,基于字节码生成子类。
● 默认优先 JDK 动态代理,可通过设置强制应用 CGLIB。拦截器链:
● 将通知(Advice)封装为拦截器(MethodInterceptor
)。
● 方法调用时,代理对象通过拦截器链按顺序执行增强逻辑,最终调用目标方法。执行流程:
● 创建代理对象 → 拦截方法调用 → 执行拦截器链 → 调用目标方法 → 返回结果。
一句话总结:Spring AOP 经过动态代理(JDK 或 CGLIB)和拦截器链构建途径增强,做完横切关注点的分离。
讲讲Mybatis 的一级、二级缓存?
MyBatis提供了两种级别的缓存:一级缓存(本地缓存)和二级缓存(全局缓存)。它们分别位于不同的作用范围,有不同的特性和使用场景。
一级缓存(本地缓存):
- 作用范围: 一级缓存是在SqlSession的生命周期内有效,也就是说,每个SqlSession拥有独立的一级缓存。
- 默认开启: 一级缓存在MyBatis中默认是开启的,无需额外配置。
- 特点: 当执行查询操作时,查询的结果会被缓存在当前SqlSession中。如果再次执行相同的查询,MyBatis会首先尝试从缓存中获取数据,而不再访问数据库。
- 自动刷新: MyBatis会在执行insert、update、delete等写操作时自动清空一级缓存,以保持数据的一致性。
二级缓存(全局缓存): - 作用范围: 二级缓存是在多个SqlSession之间共享的,即多个SqlSession允许共享同一个二级缓存。
- 安装开启: 二级缓存需要手动部署开启,需要在映射文件的标签下添加元素。
- 特点: 二级缓存能够跨SqlSession共享查询结果,有效减少数据库访问次数。它的素材存储在全局范围的缓存中,可以由多个SqlSession访问。
- 缓存策略: 你可以根据需求选择不同的缓存策略(例如LRU、FIFO等),以及配置缓存的大小、刷新间隔等参数。
- 通过注意事项: 二级缓存可以缓存的对象需要是可序列化的,要确保对象能够正确地序列化和反序列化。另外,对于关联内容的更新操作,需要手动清除相关的二级缓存,以避免脏资料的问题。
应该注意的是,虽然缓存可以提高查询性能,但不合理的使用缓存可能导致数据不一致等问题,特别是在分布式环境下。因此,在使用缓存时需要根据业务需求和性能测试结果进行合理的配置和管理。
Springboot的自动配置原理?–springboot面试必问题
1.引入@EnableAutoConfiguration: 在Spring Boot应用程序的主配置类(通常是带有@SpringBootApplication注解的类)中,通常会引入@EnableAutoConfiguration注解,该注解负责启动自动配置功能。
2.@EnableAutoConfiguration引入了@Import: @EnableAutoConfiguration注解实际上是借助@Import注解引入的。这意味着它会导入其他配置类,这些配置类包含了Spring Boot自动配置的逻辑。
3.解析@Import注解: 当Spring容器启动时,会解析@Import注解,并加载相应的配置。
4.deferredImportSelector: 通过@Import导入的配置类中可能含有了一个deferredImportSelector,它的作用是确保Spring Boot的自动配置类在最后加载,以便方便扩展和覆盖。
5.读取META-INF/spring.factories文件: Spring Boot通过SPI(Service Provider Interface)机制,读取类路径下的META-INF/spring.factories资料,该文件包含了各种自动配置类的配置。
6.过滤出AutoConfigurationClass: 从spring.factories文件中,Spring Boot会过滤出所有AutoConfigurationClass类型的类,这些类囊括了自动安装的具体实现。
7.条件化加载: 最后,Spring Boot会根据条件(@ConditionalXXX注解)来排除或涵盖特定的自动配置类。这些条件会根据应用程序的环境和配置动态生效。
通过@EnableAutoConfiguration注解引入自动配置逻辑,之后解析@Import注解,加载各种配置类,包括deferredImportSelector和自动配置类。通过SPI机制读取spring.factories文件,过滤出自动配置类,并根据条件化配置来动态加载这些类,从而实现自动配置的作用。这种机制使得Spring Boot应用程序许可根据环境和需求自动配置,极大地简化了开发和部署的工作。就是总结起来,Spring Boot的自动配置原理