1、为什么要用SpringBoot
Spring Boot 是一个用于创建独立的、基于生产级别的Spring应用程序的框架。它通过提供开箱即用的方式来简化Spring应用程序的构建和部署,使得开发者可以更专注于业务逻辑的实现,而不必花费过多时间在配置和集成上。
使用 Spring Boot 的好处包括:
-
简化配置:Spring Boot 提供了自动配置的特性,大多数情况下不需要编写大量的配置,通过约定大于配置的方式,可以快速搭建起一个应用。
-
内嵌式容器:Spring Boot 可以打包成一个可执行的 JAR 文件,并且内置了常见的 Servlet 容器,如Tomcat、Jetty等,使得应用的部署变得非常简单。
-
微服务支持:Spring Boot 对构建微服务架构有良好的支持,可以轻松集成常见的微服务组件,例如服务注册与发现、配置中心等。
-
监控和管理:Spring Boot 提供了丰富的端点(Actuator Endpoints)用于监控应用的运行状态,包括健康检查、指标收集等。
-
社区和生态系统:Spring Boot 有一个庞大的社区和生态系统,提供了大量的第三方库和解决方案,帮助开发者快速构建应用。
因此,使用Spring Boot可以大大提高开发效率,简化项目的配置和部署,并且能够更好地满足现代应用程序开发的需求。当然,并不是所有项目都需要使用Spring Boot,但对于大多数中小型的Web应用、微服务应用或者企业应用来说,Spring Boot是一个非常好的选择。
2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成 的?
Spring Boot 的核心注解是 @SpringBootApplication
。
@SpringBootApplication
是一个组合注解,包括了以下三个注解:
-
@Configuration
: 声明当前类为配置类,相当于一个传统的 XML 配置文件。 -
@EnableAutoConfiguration
: 启用 Spring Boot 的自动配置机制,可以根据类路径下的依赖自动配置 Spring 应用。 -
@ComponentScan
: 扫描当前包及其子包下被标记为 Spring 组件的类,包括@Component
、@Service
、@Controller
等注解的类,并注册为 Spring Bean。
这三个注解配合使用,可以创建一个独立的、可运行的 Spring 应用程序,而无需编写大量的配置文件。同时,这些注解还可以通过其他额外的注解来扩展和定制应用程序的行为,例如使用 @RestController
注解来声明 RESTful 的 Web 服务等。
3、运行Spring Boot有哪几种方式?
Spring Boot 有以下几种方式可以运行:
-
打包成 jar 包后通过 java -jar 命令运行:在 Maven 或 Gradle 中使用
build
命令构建 jar 包,然后在命令行中使用java -jar
命令启动应用。 -
使用 Spring Boot Maven 插件运行:在 Maven 的
pom.xml
配置文件中引入 Spring Boot Maven 插件,并使用spring-boot:run
命令启动应用。 -
使用 Spring Tool Suite 或 IntelliJ IDEA 等集成开发环境运行:在开发工具中打开 Spring Boot 应用程序的主类,并使用 IDE 提供的启动应用程序的功能来启动应用程序。
-
将 Spring Boot 应用程序部署到外部 Web 容器中运行:将应用程序打包成 WAR 文件,并将其部署到 Tomcat、Jetty 或者其他 Servlet 容器中运行。
无论使用哪种方式启动应用程序,Spring Boot 都会自动进行配置和启动内嵌的 Tomcat 或 Jetty 等 Servlet 容器,使得应用程序的启动变得非常简单。
4、如何理解 Spring Boot 中的 Starter?
在 Spring Boot 中,Starter 是一种特殊的依赖关系,它们是预先配置好的依赖项集合,用于简化项目的构建和配置。Starter 的设计初衷是为了快速搭建一个特定类型的应用程序或者集成特定功能所需的依赖项。
每个 Starter 都包含了一组常用的库和依赖项,以及适当的配置,使得开发者可以更轻松地集成这些功能到他们的应用中,而无需手动配置每个依赖项。通过使用 Starters,开发者可以快速启动一个新项目,专注于业务逻辑的开发,而无需花费时间在繁琐的依赖管理和配置上。
Spring Boot 提供了大量的官方 Starters,涵盖了各种常见的应用场景和功能需求,比如 Web 应用、数据访问、安全认证、消息队列等。开发者可以根据自己的需求选择合适的 Starter,并在项目中引入它们,从而快速构建出一个功能完善的应用程序。
总的来说,Starters 是 Spring Boot 提供的一种便捷的方式,帮助开发者快速集成各种功能和库到他们的应用程序中,加快开发速度,降低配置复杂度。
5、SpringBoot的启动流程是怎么样的?
6、SpringBoot 自动配置原理了解吗?
SpringBoot 开启自动配置的注解是@EnableAutoConfiguration
;
启动类上的注解@SpringBootApplication
是一个复合注解,包含了@EnableAutoConfiguration
:
EnableAutoConfiguration
只是一个简单的注解,自动装配核心功能的实现实际是通过 AutoConfigurationImportSelector类
@AutoConfigurationPackage //将main同级的包下的所有组件注册到容器中
@Import({AutoConfigurationImportSelector.class}) //加载自动装配类 xxxAutoconfiguration
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
AutoConfigurationImportSelector
实现了ImportSelector接口
,这个接口的作用就是收集需要导入的配置类,配合@Import()就可以将相应的类导入到 Spring 容器中。
获取注入类的方法是 selectImports()
,它实际调用的是getAutoConfigurationEntry
,这个方法是获取自动装配类的关键,主要流程可以分为这么几步:
- 获取注解的属性,用于后面的排除
- 获取所有需要自动装配的配置类的路径:这一步是最关键的,从 META-INF/spring.factories 获取自动配置类的路径
- 去掉重复的配置类和需要排除的重复类,把需要自动加载的配置类的路径存储起来
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
//1.获取到注解的属性
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
//2.获取需要自动装配的所有配置类,读取META-INF/spring.factories,获取自动配置类路径
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
//3.1.移除重复的配置
configurations = this.removeDuplicates(configurations);
//3.2.处理需要排除的配置
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
总结:
当使用 @EnableAutoConfiguration
注解启用自动配置时,实际上是通过 AutoConfigurationImportSelector
类来实现的。该类会获取 META-INF/spring.factories
文件中定义的所有自动配置类的路径,并将其导入到 Spring 容器中。
在 AutoConfigurationImportSelector
中,通过 getAutoConfigurationEntry()
方法来获取需要自动配置的类的路径。该方法会读取 META-INF/spring.factories
文件,获取所有自动配置类的路径,并根据一些条件进行过滤和排除。
在获取到自动配置类的路径后,会进行去重和排除处理,然后将最终确定的自动配置类路径存储起来。最后,通过 @Import
注解将这些自动配置类导入到 Spring 容器中。
这样,当应用程序启动时,Spring Boot 会自动根据 classpath 下的依赖和配置,扫描并加载这些自动配置类,从而实现自动配置的功能。开发者无需手动编写大量的配置代码,Spring Boot 会根据约定和默认规则进行自动化的组件装配和配置。
7、如何自定义一个 SpringBoot Srarter?
知道了自动配置原理,创建一个自定义 SpringBoot Starter 也很简单。
- 创建一个项目,命名为 demo-spring-boot-starter,引入 SpringBoot 相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
- 编写配置文件
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
private String name;
//省略getter、setter
}
- 自动装配
创建自动配置类 HelloPropertiesConfigure
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloPropertiesConfigure {
}
- 配置自动类
在/resources/META-INF/spring.factories
文件中添加自动配置类路径
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.fighter3.demo.starter.configure.HelloPropertiesConfigure
- 测试
创建一个工程,引入自定义 starter 依赖
<dependency>
<groupId>cn.fighter3</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在配置文件里添加配置
hello.name=张三
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloTest {
@Autowired
HelloProperties helloProperties;
@Test
public void hello(){
System.out.println("你好,"+helloProperties.getName());
}
}
运行结果
总结:
创建一个自定义的 Spring Boot Starter 主要需要以下几个步骤:
-
创建一个项目,并引入相关的 Spring Boot 依赖。
-
编写配置文件,用于封装需要使用者配置的属性信息。可以使用
@ConfigurationProperties
注解来实现属性绑定。 -
创建一个自动配置类,用于实现自动配置功能并将配置文件中的属性注入到相应的 Bean 中。可以使用
@Configuration
和@EnableConfigurationProperties
注解来实现自动配置。 -
在
META-INF/spring.factories
文件中添加自动配置类路径,告诉 Spring Boot 框架需要自动配置哪些组件。 -
打包发布,并在需要使用的工程中引入自定义 Starter 的依赖,即可使用自定义 Starter 提供的功能。
通过自定义 Spring Boot Starter,可以将一些常用的组件或配置打包成一个独立的模块,方便其他开发者在自己的项目中使用。自定义 Starter 的好处在于可以减少重复的配置工作,提高开发效率。
8、Springboot 启动原理?
SpringApplication 这个类主要做了以下四件事情:
- 推断应用的类型是普通的项目还是 Web 项目
- 查找并加载所有可用初始化器 , 设置到 initializers 属性中
- 找出所有的应用程序监听器,设置到 listeners 属性中
- 推断并设置 main 方法的定义类,找到运行的主类
SpringBoot 启动大致流程如下 :
总结:
Spring Boot 的启动原理主要由 SpringApplication
类负责。它主要完成以下四个任务:
-
推断应用的类型:根据 classpath 中的依赖和类来推断应用的类型是普通的项目还是 Web 项目。如果发现有
Spring MVC
相关的类,就将应用类型标记为 Web 应用。 -
加载初始化器:在启动过程中,Spring Boot 会查找并加载所有可用的初始化器(
ApplicationContextInitializer
接口的实现类),并将它们设置到initializers
属性中。这些初始化器可以用于在 Spring 应用程序上下文创建之前对其进行额外的配置。 -
查找应用程序监听器:Spring Boot 会找到所有的应用程序监听器(
ApplicationListener
接口的实现类),并将它们设置到listeners
属性中。这些监听器用于在不同的阶段对应用程序事件进行响应,例如应用程序启动完成、关闭等。 -
推断并设置主类:Spring Boot 会根据启动类的名称和主类的位置来推断并设置主类。这样可以确保 Spring Boot 应用程序能够正确地运行,并将主类传递给底层的 Spring 框架。
通过以上步骤,SpringApplication
类能够根据应用程序类型、初始化器、监听器和主类等信息,完成 Spring Boot 应用程序的启动和配置。它提供了简化的方式来快速构建和运行 Spring Boot 应用程序。
上述八股文参考自hollis666、二哥的面渣逆袭。1
https://javabetter.cn ↩︎