深入理解 Spring Boot:核心知识与约定大于配置原则
深入理解 Spring Boot:核心知识与约定大于配置原则
Spring Boot作为Spring生态系统的重要组成部分,以其"约定大于配置"的理念和开箱即用的特性,极大地简化了Spring应用的开发过程。本文将深入探讨Spring Boot的核心知识,包括其诞生背景、主要优点、关键概念(如Starters)、常用注解、启动流程以及自动配置机制等,帮助读者全面理解这一强大框架。
Spring Boot的诞生背景
Spring Boot的诞生源于对传统Spring框架的优化需求。虽然Spring的组件代码是轻量级的,但其配置却是重量级的,需要大量XML配置。为了减少配置文件,简化开发过程,Spring Boot应运而生。
通常所说的Spring框架主要指的是Spring Framework。
Spring Boot的主要优点
- 开发基于Spring的应用程序变得更容易。
- 显著减少了Spring Boot项目所需的开发或工程时间,整体生产力得到提升。
- 无需编写大量样板代码、XML配置和注释。
- Spring Boot应用程序可以很容易地与Spring生态系统集成,如Spring JDBC、Spring ORM、Spring Data、Spring Security等。
- 遵循"固执己见的默认配置"原则,以减少开发工作(默认配置可以根据需要进行修改)。
- 提供嵌入式HTTP服务器(如Tomcat和Jetty),便于开发和测试Web应用程序。
- 提供命令行接口(CLI)工具,用于开发和测试Spring Boot应用程序,支持Java或Groovy。
- 提供多种插件,可以使用内置工具(如Maven和Gradle)开发和测试Spring Boot应用程序。
Spring Boot Starters
Spring Boot Starters是一组预定义的依赖项集合,用于快速启动常见的应用程序功能。例如,若要快速启动一个Spring Boot Web应用程序,只需在项目中引入spring-boot-starter-web
依赖即可。
支持的内嵌Servlet容器
Spring Boot支持以下三个内嵌Servlet容器:
Name | Servlet Version |
---|---|
Tomcat 9.0(默认容器) | 4.0 |
Jetty 9.4 | 3.1 |
Undertow 2.0 | 4.0 |
常用注解
Spring Boot中常用的注解包括:
@SpringBootApplication
:用于标注Spring Boot应用程序主类,相当于@Configuration、@ComponentScan和@EnableAutoConfiguration的组合。@Controller
:用于标注控制器类,处理请求并返回响应。@RestController
:@Controller
的变体,用于处理RESTful API请求并返回JSON格式的响应。@RequestMapping
:用于将URL请求映射到处理器方法上,支持通过value、method、params和headers属性进行配置。@Autowired
:用于自动装配Spring容器中的Bean对象。@Component
:用于标注一个类为Spring Bean,Spring会自动扫描并将其注册到容器中。@Bean
:用于标注一个方法,表示该方法返回一个Bean对象并将其注册到Spring容器中。@Service
:用于标注服务类,提供业务逻辑服务。@Repository
:用于标注DAO类,提供数据库访问操作。@Value
:用于注入配置文件中的属性值。@Profile
:用于指定Bean所属的环境,支持根据环境创建不同Bean。@Conditional
:根据条件决定是否创建Bean对象。@Configuration
:用于标注配置类,包含Bean的定义和配置信息。@ComponentScan
:用于指定要扫描的包或类范围。@EnableAutoConfiguration
:用于自动配置Spring Boot应用程序,根据依赖项自动配置Spring应用程序。
当在Spring Boot应用程序中使用@ComponentScan注解时,Spring Boot将自动扫描注解类所在的包及其子包下的所有类,将带有@Component、@Service、@Controller、@Repository等注解的类注册为Bean,这样这些Bean就可以被注入到其他类中使用了。
Spring Boot的启动流程
以下是一个典型的Spring Boot应用程序启动类代码:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Spring Boot的启动过程大致分为9个步骤:
- 创建监听器并准备监听。
- 容器环境预配置。
- 打印banner(logo)。
- 创建Spring容器(IoC)。
- 容器刷新前置处理。
- 容器刷新。
- 容器刷新后置处理。
- 发出容器刷新结束通知。
- 调用runner执行启动后的相关程序。
具体解析如下:
- 创建监听器并准备监听:从
META-INF/spring.factories
文件中获取监听器类列表。 - 打印banner:在控制台输出应用程序的logo。
- 容器操作:实现IoC容器的创建和管理。
Spring Boot的自动配置机制
Spring Boot的自动配置主要通过条件注解机制和优先级机制实现,具体步骤如下:
- Spring Boot启动时扫描classpath下的
META-INF/spring.factories
文件,获取所有自动配置类的全限定名。 - 根据条件注解(如
@ConditionalOnClass
、@ConditionalOnMissingClass
、@ConditionalOnBean
等)判断哪些自动配置类需要生效。 - 如果某个自动配置类需要生效,Spring Boot会自动将该类的配置信息添加到Spring上下文中。
- 如果多个自动配置类之间存在冲突,Spring Boot会根据优先级决定哪个配置生效,可以通过修改配置文件中的属性值来调整优先级。
"约定大于配置"原则
在Spring Boot中,"约定大于配置"的原则意味着开发人员只需配置不符合默认约定的部分,其他部分则采用默认配置。这种设计思想大大减少了配置工作量,提高了开发效率。
启动类扫描范围
需要注意的是,Spring Boot的启动类只能扫描到当前包及其子包下的类。因此,在设计项目结构时需要合理规划包的层次关系。