Cynicism Cynicism
首页
  • 前端学习笔记

    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
    • 小程序笔记
  • 后端学习笔记

    • 《JavaWeb》
    • 《SSM》
    • 《瑞吉外卖》
    • 《Git》
    • 《SpringCloud》
    • 《黑马点评》
    • 《Spring原理》
    • 《JVM》
    • 《Java并发编程》
    • 《学成在线》
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试
  • 常见问题
  • 实用技巧
  • 友情链接
实习
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Cynicism

Java后端学习中的IKUN
首页
  • 前端学习笔记

    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
    • 小程序笔记
  • 后端学习笔记

    • 《JavaWeb》
    • 《SSM》
    • 《瑞吉外卖》
    • 《Git》
    • 《SpringCloud》
    • 《黑马点评》
    • 《Spring原理》
    • 《JVM》
    • 《Java并发编程》
    • 《学成在线》
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试
  • 常见问题
  • 实用技巧
  • 友情链接
实习
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 面试

    • SpringBoot篇
      • 1. SpringBoot自动配置原理
      • 2. SpringBoot相比于Spring的缺点
      • 3. 为什么SpringBoot的jar包可以直接运行
      • 4. SpringBoot可以同时处理多少请求
      • 5. SpringBoot如何优化启动速度
      • 6. SpringBoot解决跨域的方式
      • 7. SpringBoot获取配置方式
      • 8. 为什么springboot使用cglib作为默认的aop代理模式
      • 9. SpringBoot内置Tomcat启动原理
      • 10. SpringBoot外部Tomcat启动原理
      • 11. SpringBoot读取配置文件的原理
      • 12. SpringBoot默认日志实现框架
    • Spring篇
    • Java篇
    • 项目篇
    • Linux篇
    • Kafka篇
  • 常见问题

  • 实用技巧

  • 友情链接
  • 更多
  • 面试
cynicism
2024-01-11
目录

SpringBoot篇

# 1. SpringBoot自动配置原理

SpringBoot的自动配置原理的核心是:SpringBootApplication注解,这个注解主要包括以下三个核心注解:

  • @SpringBootConfiguration:这个注解实际上是@Configuration注解,表示SpringBoot启动类是一个配置类,最终会被注入到Spring容器中

  • @EnableAutoConfiguration:这个注解开启了自动配置功能。它包含两个重要的注解:

    • @AutoConfigurationPackage:这个注解会将启动类所在包下的所有子包的组件(@Entity注解)扫描并注入到Spring容器中,和@ComponentScan扫描的对象不一样
    • @Import(AutoConfigurationImportSelector.class):这个注解会通过AutoConfigurationImportSelector类的getCandidateConfigurations()方法查找位于META-INF/spring.factories文件中的所有自动配置类(筛选出以EnableAutoConfiguration结尾的key),并加载这些类(不是全都加载),如下图
  • @ComponentScan:这个注解会扫描当前类下的package,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中

所以在spring boot中,我们通常将controller、pojo、service、dao等包放在启动类同级目录下的原因。

🔎前面加载的所有自动配置类并不是都生效的,每一个xxxAutoConfiguration自动配置类都是在某些特定的条件之下才会生效。这些条件限制是通过@ConditionOnxxx注解实现的。

# 2. SpringBoot相比于Spring的缺点

SpringBoot相比于Spring,确实存在一些缺点:

  • 缺少灵活性:由于SpringBoot注重快速搭建项目,因此在某些情况下,它可能缺乏灵活性。例如,如果需要在项目中扩展一些功能,可能就需要手动配置
  • 难以适应较为复杂的场景:SpringBoot主要针对简单的应用程序,一旦项目变得复杂,就需要考虑功能的划分和更加细致的配置

# 3. 为什么SpringBoot的jar包可以直接运行

SpringBoot的jar包可以直接运行的原因主要有以下几点:

  • Fat Jar:SpringBoot应用打包后,生成的jar包被称为Fat Jar(即jar包中包含jar),它包含了应用依赖的所有jar包和Spring Boot loader相关的类

  • Spring Boot Loader:Spring Boot Loader提供了一套标准用于执行SpringBoot打包出来的jar。当我们使用java -jar执行jar包的时候,会调用Spring Boot Loader中的JarLauncher的Main方法,而不是我们编写的SpringApplication,其中该Main方法会创建一个LaunchedURLClassLoader来加载依赖的jar包,并以一个新线程启动应用的Main函数

# 4. SpringBoot可以同时处理多少请求

SpringBoot可以同时处理的请求数量主要取决于以下几个参数:

  • server.tomcat.threads.min-spare:最少的工作线程数,默认大小是10。如果并发请求的数量达不到10,就会依次使用这几个线程去处理请求

  • server.tomcat.threads.max:最多的工作线程数,默认大小是200。如果并发请求的数量在10到200之间,就会使用这些临时工线程进行处理

  • server.tomcat.max-connections:最大连接数,默认大小是8192。表示Tomcat可以处理的最大请求数量,超过8192的请求就会被放入到等待队列

  • server.tomcat.accept-count:等待队列的长度,默认大小是100

# 5. SpringBoot如何优化启动速度

SpringBoot的启动速度可以通过以下几种方式进行优化:

  • 减少自动配置的类:SpringBoot的自动配置会加载很多不必要的类,可以通过exclude参数来排除这些类,减少启动时加载的类的数量

  • 懒加载:SpringBoot 2.2.0版本开始支持懒加载,可以通过在application.properties或者application.yml中设置spring.main.lazy-initialization=true来开启懒加载

  • 减少扫描的包:通过在@ComponentScan注解中指定需要扫描的包,减少SpringBoot启动时需要扫描的包的数量

  • 优化JVM参数:可以通过调整JVM的启动参数,如-Xms和-Xmx,来优化内存使用,提高启动速度

  • 异步初始化:SpringBoot 2.4.0版本开始支持异步初始化,可以通过在application.properties或者application.yml中设置spring.main.lazy-initialization.include=async来开启异步初始化

  • 创建扫描索引:Spring5提供了spring-Context-indexer,通过在启动类上添加@Indexd注解

升级jdk17:提供了更优秀的垃圾回收器,和SpringBoot3:本地化机制

# 6. SpringBoot解决跨域的方式

跨域是前端的异常

  • 通过注解解决跨域(局部方案):@CrossOrigin(添加在controller的类或者方法上)
  • 配置 CORS 解决跨域:实现WebMvcConfigurer接口,重写addCorsMappings方法并设置允许跨域的代码
  • 通过 CorsFilter 解决跨域:编写过滤器,然后注册过滤器
  • 通过 nginx 配置 CORS 解决跨域(推荐):修改NGINX的配置文件即可

# 7. SpringBoot获取配置方式

SpringBoot读取配置的方式主要有以下几种:

  • @Value注解:可以直接在字段上使用@Value注解来读取配置文件中的值

  • Environment对象:可以注入Environment对象,然后通过getProperty方法来获取配置值,或者实现一个EnvironmentAware接口

  • @ConfigurationProperties注解:这是一种类型安全的属性绑定机制,可以将配置文件中的属性绑定到一个Bean上。

@ConfigurationProperties(prefix = "config")
public class ConfigProperties {
    private String key;
    // getters and setters
}
1
2
3
4
5
  • @PropertySource注解:可以用来指定自定义的配置文件(properties文件),然后结合@Value或者Environment来读取配置值

# 8. 为什么springboot使用cglib作为默认的aop代理模式

从SpringBoot 2.x开始,为了解决使用JDK动态代理可能导致的类型转换异常,SpringBoot选择使用CGLIB。如果需要替换使用JDK动态代理,可以通过配置项spring.aop.proxy-target-class=false来进行修改

# 9. SpringBoot内置Tomcat启动原理

  1. 引入依赖:在pom.xml文件中,我们引入spring-boot-starter-web依赖,这个依赖中包含了spring-boot-starter-tomcat
  2. 启动入口:在SpringBoot应用的主类中,我们调用SpringApplication.run()方法来启动应用
  3. 创建和刷新ApplicationContext:SpringApplication.run()方法会创建一个ApplicationContext,并进行初始化和刷新操作。在这个过程中,SpringBoot会自动配置Tomcat,并将其作为默认的web服务器
  4. 内置Tomcat启动:在ApplicationContext刷新的过程中,SpringBoot会检测到内置的Tomcat,并自动启动它

# 10. SpringBoot外部Tomcat启动原理

  1. 修改POM文件:首先,我们需要在pom.xml文件中将spring-boot-starter-web依赖更改为spring-boot-starter-web,并排除内置的Tomcat
  2. 修改启动类:在SpringBoot应用的主类中,我们需要将其更改为扩展(extends)SpringBootServletInitializer类,这样就可以在外部Tomcat中启动应用
  3. 打包为WAR文件:然后,我们需要将应用打包为WAR文件,以便将其部署到外部Tomcat中。这可以通过在pom.xml文件中更改元素来实现
  4. 部署到外部Tomcat:最后,我们将生成的WAR文件部署到外部Tomcat的webapps目录下。当Tomcat启动时,它会自动加载并运行所有在webapps目录下的应用。

# 11. SpringBoot读取配置文件的原理

通过事件监听的方式读取配置文件:ConfigFileApplicationListener

加载优先级顺序:

  1. file:./config/
  2. file:./config/任意文件夹或文件
  3. file:./
  4. classpath:/config/
  5. classpath:/

这5个位置的优先级从高到低排序,也就是说,如果在file:./config/和classpath:/中都有application.properties文件,那么SpringBoot会优先加载file:./config/中的文件

# 12. SpringBoot默认日志实现框架

当你创建一个添加了任何 starter 的 Spring Boot 应用程序时,它们都依赖于 spring-boot-starter,而 spring-boot-starter 又依赖于 spring-boot-starter-logging,这就为日志记录添加了 logback 依赖。

因此,默认情况下,Spring Boot 配置了 Slf4j(日志门面) 和 Logback(日志实现) 来记录日志

使用 Log4j2 代替 Logback 如果你更喜欢使用 Log4j2 而不是 Logback,可以从 spring-boot-starter 中排除 spring-boot-starter-logging,并在 pom.xml 中添加 spring-boot-starter-log4j2 依赖

详情查看:https://www.cnblogs.com/zhaodalei/p/17251028.html

切换日志框架就是选择合适的Slf4j的适配器(可选)和桥接器(必选),不兼容才要进行适配

编辑 (opens new window)
上次更新: 2025/05/12, 04:51:03
Spring篇

Spring篇→

最近更新
01
JVM调优
06-03
02
Linux篇
03-30
03
Kafka篇
03-30
更多文章>
Theme by Vdoing | Copyright © 2023-2025 Cynicism | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式