springboot核心原理
1.基于你对springboot的理解描述一下什么是springboot
它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用,
内置tomcat,无需打包部署,直接运行。
2.约定优于配置指的是什么?
maven 的目录结构
a) 默认有 resources 文件夹存放配置文件
b) 默认打包方式为 jar
spring-boot-starter-web 中默认包含 spring mvc 相关依赖以及内置的 tomcat 容器,使得构建一个 web 应用更加简单
默认提供 application.properties/yml 文件
默认通过 spring.profiles.active 属性来决定运行环境时读取的配置文件
EnableAutoConfiguration 默认对于依赖的 starter 进行自动
3.@SpringBootApplication由哪几个注解组成,这几个注解分别表示什么作用
SpringBootApplication 本质上是由 3 个注解组成,分别是
@Configuration
@EnableAutoConfiguration
@ComponentScan
@Configuration:
在启动类里面标注了@Configuration,意味着它其实也是一个 IoC
容器的配置类
@EnableAutoConfiguration:
springboot 应用把所有符合条件的@Configuration 配置
都加载到当前 SpringBoot 创建并使用的 IoC 容器中。
@ComponentScan:
ComponentScan 默认会扫描当前 package 下的的所有加
了@Component 、@Repository、@Service、@Controller的类到 IoC 容器中;
4.springboot自动装配的实现原理

如果是之前的spring中使用redis需要在xml定义bean,现在只需要依赖一个spring-boot-starter-data-redis
的jar包,jar中定义了RedisConfiguration,当启动的时候spring会自动装载RedisConfiguration,那spring是如何知道配置类在哪里的呢?RedisConfiguration类的路径放在了classpath*META-INF/spring.factories的文件中,spring会加载这个文件中配置的configuration
(1)SpringApplication.run(AppConfig.class,args);执行流程中有refreshContext(context);这句话.
(2)refreshContext(context);内部会解析我们的配置类上的标签.实现自动装配功能的注解@EnableAutoConfiguration
(3)会解析@EnableAutoConfiguration这个注解里面的@Import引入的配置类.AutoConfigurationImportSelector
(4)AutoConfigurationImportSelector这个类中有这个方法.SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
(5)SpringFactoriesLoader.loadFactoryNames的作用就是读取jar包中的/项目中的META-INF/spring.factories文件.
(6)spring.factories配置了要自动装配的Configuration类
5.spring中的spi机制的原理是什么?
SPI的全名为Service Provider Interface,为某个接口寻找服务实现的机制。
当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。通过这个约定,就不需要把服务放在代码中了,通过模块被装配的时候就可以发现服务类了。
在springboot的自动装配过程中,最终会加载META-INF/spring.factories文件,而加载的过程是由SpringFactoriesLoader加载的。从CLASSPATH下的每个Jar包中搜寻所有META-INF/spring.factories配置文件,然后将解析properties文件,找到指定名称的配置后返回。需要注意的是,其实这里不仅仅是会去ClassPath路径下查找,会扫描所有路径下的Jar包,只不过这个文件只会在Classpath下的jar包中。
通过spi技术可以自定义starter,在自定义的配置文件META-INF/spring.factories中加入实现类,依赖这个starter的项目就会扫描jar包下的配置,找到实现类进行装载实例化
自我总结
Spring Boot 是 Spring 项目下的一个框架,旨在简化 Spring 应用的初始搭建以及开发过程。下面从自动配置、起步依赖、嵌入式服务器等方面详细介绍其核心原理。1. 自动配置(Auto - Configuration)
原理
Spring Boot 的自动配置是其核心特性之一,它能够根据项目中添加的依赖和配置,自动为应用程序配置合适的 Bean。其实现依赖于 Spring 的条件化配置机制,通过 @Conditional
注解及其衍生注解(如 @ConditionalOnClass
、@ConditionalOnMissingBean
等)来判断是否需要进行配置。
Spring Boot 在启动时会扫描类路径下的 META - INF/spring.factories
文件,该文件中定义了一系列的自动配置类。Spring Boot 会根据这些条件注解来判断是否满足配置条件,如果满足则将相应的 Bean 定义注册到 Spring 容器中。
示例
假设项目中添加了 Spring Data JPA 的依赖,Spring Boot 会检查类路径下是否存在 JPA 相关的类。如果存在,并且容器中没有手动配置 JPA 的相关 Bean,Spring Boot 会自动配置 EntityManagerFactory
、JpaTransactionManager
等 Bean,让开发者可以直接使用 JPA 进行数据库操作,而无需进行繁琐的配置。
2. 起步依赖(Starter Dependencies)
原理
起步依赖是 Spring Boot 提供的一种简化依赖管理的方式。它是一组经过精心挑选的依赖集合,将开发过程中常用的依赖组合在一起。当开发者添加某个起步依赖时,实际上是添加了一系列与之相关的依赖,避免了手动添加和管理大量依赖的麻烦。
每个起步依赖都有一个明确的功能,例如 spring - boot - starter - web
包含了构建 Web 应用所需的所有依赖,如 Spring MVC、Tomcat 等;spring - boot - starter - data - jpa
包含了使用 JPA 进行数据库操作所需的依赖。
示例
如果要开发一个简单的 Web 应用,只需要在 pom.xml
中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring - boot - starter - web</artifactId>
</dependency>
添加这个依赖后,Spring Boot 会自动引入 Spring MVC、Tomcat 等相关依赖,开发者可以直接编写控制器和服务类来构建 Web 应用。
3. 嵌入式服务器(Embedded Servers)
原理
Spring Boot 支持嵌入式服务器,如 Tomcat、Jetty、Undertow 等。在传统的 Java Web 开发中,需要将应用打包成 WAR 文件,然后部署到独立的服务器中。而 Spring Boot 可以将服务器嵌入到应用中,将应用打包成可执行的 JAR 文件,直接运行。
在应用启动时,Spring Boot 会根据项目中添加的依赖自动配置并启动嵌入式服务器。例如,如果添加了 spring - boot - starter - web
依赖,默认会使用 Tomcat 作为嵌入式服务器。
示例
以下是一个简单的 Spring Boot Web 应用示例:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class MySpringBootApp {
@GetMapping("/")
public String hello() {
return "Hello, Spring Boot!";
}
public static void main(String[] args) {
SpringApplication.run(MySpringBootApp.class, args);
}
}
在这个示例中,运行 main
方法时,Spring Boot 会自动配置并启动嵌入式 Tomcat 服务器,将应用部署到该服务器上,开发者可以通过浏览器访问 http://localhost:8080
来测试应用。
4. 配置文件处理
原理
Spring Boot 支持多种配置文件格式,如 application.properties
、application.yml
等。在应用启动时,Spring Boot 会自动加载这些配置文件,并将其中的配置信息注入到相应的 Bean 中。
开发者可以在配置文件中定义应用的各种配置项,如数据库连接信息、服务器端口等。Spring Boot 会根据配置文件中的内容对应用进行相应的配置。
示例
在 application.properties
中配置服务器端口:
server.port = 8081
或者在 application.yml
中配置:
server:
port: 8081
这样,应用启动时会使用配置的端口 8081 来启动服务器。
总结
Spring Boot 通过自动配置、起步依赖、嵌入式服务器和配置文件处理等核心特性,简化了 Spring 应用的开发和部署过程。开发者可以更专注于业务逻辑的实现,而无需花费大量时间在繁琐的配置和依赖管理上。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)