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