Spring?Boot快速入門、應(yīng)用分析及常用注解示例詳解
前言
本博客將帶您快速入門 Spring Boot,我們將探討其核心概念、常用注解以及實(shí)際應(yīng)用中的一些分析。通過具體示例,您將能夠了解如何高效地使用 Spring Boot 開發(fā)應(yīng)用程序,并掌握一些常見的使用模式。
SpringBoot是什么
Spring Boot 是一個(gè)基于 Spring 框架的開源 Java 框架,旨在簡化 Spring 應(yīng)用程序的開發(fā)過程。它通過約定優(yōu)于配置的方式,簡化了 Spring 應(yīng)用的設(shè)置和開發(fā),使得創(chuàng)建獨(dú)立的、生產(chǎn)級(jí)別的 Spring 應(yīng)用變得更加快捷和方便。
大多數(shù) Spring Boot 應(yīng)用只需編寫少量配置,即可快速整合 Spring 平臺(tái)及第三方技術(shù)。其主要特性包括:
1.快速創(chuàng)建獨(dú)立 Spring 應(yīng)用:
- 與傳統(tǒng)的 SSM(Spring + Spring MVC + MyBatis)開發(fā)模式相比,Spring Boot 簡化了導(dǎo)入依賴、配置和啟動(dòng)的流程。
2.內(nèi)嵌 Servlet 容器:
- 直接將 Tomcat、Jetty 或 Undertow 嵌入應(yīng)用中,無需將應(yīng)用部署為 WAR 包??梢院唵蔚厥褂?JAR 文件運(yùn)行,例如通過命令 java -jar your-app.jar 啟動(dòng)應(yīng)用。
3.場景啟動(dòng)器(Starter):
- 提供可選的 Starter 依賴,簡化不同場景的應(yīng)用整合。例如,web、JSON、郵件、對(duì)象存儲(chǔ)(OSS)、異步處理、定時(shí)任務(wù)和緩存等場景都有相應(yīng)的 Starter,可以輕松導(dǎo)入所需功能所需的依賴,并控制版本。
4.按需自動(dòng)配置:
- 根據(jù)引入的 Starter,Spring Boot 會(huì)自動(dòng)配置相關(guān)的 Spring 組件及第三方庫。若要啟用某個(gè)場景,只需添加對(duì)應(yīng)的 Starter,所有必要的配置都會(huì)自動(dòng)完成。
5.約定優(yōu)于配置:
- 每個(gè)場景都提供豐富的默認(rèn)配置,開發(fā)者無需繁瑣地手動(dòng)設(shè)置,只需在配置文件中修改少量選項(xiàng)即可滿足特定需求。
6.生產(chǎn)級(jí)特性:
- Spring Boot 提供監(jiān)控指標(biāo)、健康檢查、外部化配置等功能,適用于生產(chǎn)環(huán)境中的應(yīng)用管理和監(jiān)控,尤其與 Kubernetes 等容器編排平臺(tái)兼容良好。
7.無代碼生成與無 XML 配置:
- Spring Boot 提倡無代碼生成、無 XML 配置的開發(fā)方式,使得項(xiàng)目結(jié)構(gòu)更加清晰,開發(fā)更為高效。
總結(jié):Spring Boot 通過簡化開發(fā)、配置、整合、部署、監(jiān)控和運(yùn)維的各個(gè)環(huán)節(jié),幫助開發(fā)者快速構(gòu)建和管理應(yīng)用程序,提高工作效率。
SpringBoot官網(wǎng)
快速入門
創(chuàng)建maven項(xiàng)目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>所有springboot項(xiàng)?都必須繼承? spring-boot-starter-parent
導(dǎo)?場景,場景啟動(dòng)器
<!--web開發(fā)的場景啟動(dòng)器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>SpringBoot的啟動(dòng)類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //這是?個(gè)SpringBoot應(yīng)?
public class SpringbootTestOneApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestOneApplication.class, args);
}
}業(yè)務(wù)
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
System.out.println("hello World");
return "Hello World";
}
}默認(rèn)啟動(dòng)訪問: localhost:8080
SpringBoot應(yīng)?打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>mvn clean package 把項(xiàng)?打成可執(zhí)?的jar包
java -jar demo.jar 啟動(dòng)項(xiàng)?
小結(jié)
場景啟動(dòng)器,默認(rèn)?持的所有場景:https://docs.spring.io/spring-boot/redirect.html?page=using#using.build-systems.starters
- 官方提供的場景:命名為: spring-boot-starter-*
- 第三?提供場景:命名為: *-spring-boot-starter
application.properties :
集中式管理配置。只需要修改這個(gè)?件就行 。
配置基本都有默認(rèn)值
能寫的所有配置都在:https://docs.spring.io/spring-boot/appendix/application-properties/index.html#appendix.application-properties
應(yīng)用分析
依賴管理機(jī)制
1.為什么導(dǎo)? starter-web 所有相關(guān)依賴都導(dǎo)?進(jìn)來?
起步依賴是一個(gè)方便的方式,允許開發(fā)者僅通過引入一個(gè)依賴項(xiàng)就能獲得多個(gè)其他相關(guān)依賴。這種方法減少了手動(dòng)管理每個(gè)單獨(dú)依賴的復(fù)雜性。
當(dāng)你添加 spring-boot-starter-web 這個(gè)依賴時(shí),Spring Boot 會(huì)在其內(nèi)部定義一組依賴關(guān)系,包括:
- Spring MVC:用于構(gòu)建 Web 應(yīng)用的核心框架。
- Jackson:用于 JSON 數(shù)據(jù)的序列化和反序列化。
- Tomcat:作為默認(rèn)的嵌入式 servlet 容器(也可以配置其他容器,如 Jetty 或 Undertow)。
- 其他與 Web 相關(guān)的庫,比如用于處理表單、驗(yàn)證等的標(biāo)準(zhǔn)庫。
2.為什么版本號(hào)都不?寫?
Spring Boot 提供了一個(gè) BOM(Bill of Materials),它定義了不同庫和組件的版本。這使得你只需引入起步依賴(Starter Dependencies),如 spring-boot-starter-web,就能自動(dòng)獲得與該版本的 Spring Boot 兼容的所有依賴項(xiàng)及其版本。
一旦需要更新 Spring Boot 版本,只需修改一個(gè)地方(即 Spring Boot 的版本號(hào)),所有相關(guān)依賴的版本會(huì)自動(dòng)更新到適用于新版本的最新兼容版本。這種方式方便了項(xiàng)目的維護(hù)和升級(jí)。
3.自定義版本號(hào)
可以利用 Maven 的就近原則,在當(dāng)前項(xiàng)目的 < properties> 標(biāo)簽中定義父項(xiàng)目版本的屬性鍵,從而在導(dǎo)入依賴時(shí)直接指定版本號(hào)。這種做法提升了配置的清晰度,使得項(xiàng)目的版本管理更加靈活和便于維護(hù)。
4、第三?的jar包
boot?項(xiàng)?沒有管理的需要自行聲明好
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> </dependency>

?動(dòng)配置機(jī)制
?動(dòng)配置的 Tomcat、SpringMVC 等
通過導(dǎo)入特定場景的起步依賴,Spring Boot 會(huì)自動(dòng)為相關(guān)功能配置所需的核心組件,如 Tomcat 和 Spring MVC。這意味著開發(fā)者無需手動(dòng)配置組件,例如 DispatcherServlet、ViewResolver 和 CharacterEncodingFilter,這些都已默認(rèn)配置完成。
默認(rèn)的包掃描規(guī)則
在 Spring Boot 中,默認(rèn)的包掃描規(guī)則是以 @SpringBootApplication 注解標(biāo)注的類為主程序類。Spring Boot 僅會(huì)掃描該類所在的包及其子包,以實(shí)現(xiàn)自動(dòng)的組件掃描功能。
如果需要自定義掃描路徑,可以使用如下方式:
@SpringBootApplication(scanBasePackages = "com.itheima")
@ComponentScan("com.itheima") //可以直接指定要掃描的包路徑。
配置默認(rèn)值
配置文件中的所有配置項(xiàng)會(huì)與某個(gè)類的屬性進(jìn)行一一綁定,這些類被稱為屬性類。例如:
- ServerProperties 類會(huì)綁定與 Tomcat 服務(wù)器相關(guān)的所有配置。
- MultipartProperties 類會(huì)綁定與文件上傳相關(guān)的所有配置。
- 有關(guān)具體的綁定情況,可以參考官方文檔或相應(yīng)的屬性類。
按需加載自動(dòng)配置
當(dāng)導(dǎo)入 spring-boot-starter-web 這個(gè)場景啟動(dòng)器時(shí),它不僅會(huì)引入與該場景相關(guān)的功能依賴,還會(huì)引入一個(gè)核心基礎(chǔ)的 starter,即 spring-boot-starter。這個(gè)基礎(chǔ) starter 是所有其他 starter 的核心組件。
spring-boot-starter 會(huì)引入一個(gè)名為 spring-boot-autoconfigure 的包,該包中包含了多種場景的自動(dòng)配置類。這些自動(dòng)配置類負(fù)責(zé)根據(jù)應(yīng)用的需求自動(dòng)配置所需的組件和功能。
盡管 spring-boot-autoconfigure 包中包含了所有場景的自動(dòng)配置,但并非所有的自動(dòng)配置都會(huì)被默認(rèn)啟用。只有在導(dǎo)入特定的場景依賴時(shí),相關(guān)的自動(dòng)配置才會(huì)被激活,這樣可以實(shí)現(xiàn)按需加載,確保應(yīng)用只啟用所需的功能,提升靈活性和性能。
總結(jié):導(dǎo)入場景啟動(dòng)器后,會(huì)觸發(fā) spring-boot-autoconfigure 包中的自動(dòng)配置生效,從而使得容器中具備相關(guān)場景的功能。通過這種方式,Spring Boot 可以根據(jù)所導(dǎo)入的場景自動(dòng)配置必要的組件和服務(wù),簡化了配置過程并提升了應(yīng)用的功能性。
常用注解
組件注冊
- @Configuration
功能: 表示該類是一個(gè)配置類,Spring 容器可以從中獲取 Bean 定義。此類通常包含一個(gè)或多個(gè)使用 @Bean 注解的方法,這些方法會(huì)返回要注冊的 Bean 實(shí)例。 - @SpringBootConfiguration
功能: 這是 Spring Boot 的一個(gè)特定注解,實(shí)際上是 @Configuration 的一個(gè)擴(kuò)展。它用于標(biāo)記主配置類,并且結(jié)合其他 Spring Boot 特性(如自動(dòng)配置)工作。它通常用于標(biāo)識(shí) Spring Boot 應(yīng)用的啟動(dòng)類。 - @Bean
功能: 用于在 @Configuration 類中定義一個(gè) Bean。被 @Bean 注解的方法會(huì)返回一個(gè)對(duì)象,該對(duì)象將被注冊到 Spring 應(yīng)用上下文中,以便其他組件可以依賴和使用。 - @Scope
功能: 用于定義 Bean 的作用域。通過這個(gè)注解,可以指定 Bean 是單例(默認(rèn))還是多例,或者其他作用域(例如請求、會(huì)話等)。例如,@Scope(“prototype”) 表示每次請求該 Bean 時(shí)都會(huì)創(chuàng)建一個(gè)新的實(shí)例。 - @Controller
功能: 用于標(biāo)識(shí)一個(gè)控制器類,通常用于處理 Web 請求。Spring 會(huì)自動(dòng)將被 @Controller 注解的類作為 MVC 模式中的控制器,并進(jìn)行相應(yīng)的組件掃描和管理。 - @Service
功能: 用于標(biāo)識(shí)一個(gè)服務(wù)類,通常用于業(yè)務(wù)邏輯層。被 @Service 注解的類會(huì)被 Spring 容器管理,并可以用作服務(wù)組件,以實(shí)現(xiàn)業(yè)務(wù)邏輯。 - @Repository
功能: 用于標(biāo)識(shí)一個(gè)數(shù)據(jù)訪問層的類。被 @Repository 注解的類通常用于數(shù)據(jù)持久化操作,Spring 會(huì)為該類提供異常轉(zhuǎn)換等功能,以便與數(shù)據(jù)庫交互。 - @Component
功能: 一個(gè)通用的組件注解,用于標(biāo)識(shí)一個(gè) Spring 組件。任何被 @Component 注解的類會(huì)被 Spring 容器自動(dòng)掃描并注冊為 Bean??梢杂糜跊]有特定角色的類。 - @Import
功能: 用于導(dǎo)入其他配置類或普通類,使其成為當(dāng)前配置類的一部分。使用此注解可以將多個(gè)配置類組合在一起,從而實(shí)現(xiàn)更加模塊化的配置管理。 - @ComponentScan
功能: 用于指定 Spring 應(yīng)該掃描哪些包中的組件。默認(rèn)情況下,Spring Boot 會(huì)掃描主應(yīng)用程序類所在的包及其子包,使用 @ComponentScan 可以自定義掃描的路徑。
步驟:
- 使用 @Configuration 創(chuàng)建一個(gè)配置類。
- 在該配置類中,自定義方法并通過 @Bean 注解將組件注冊到 Spring 容器中。
- 也可以使用 @Import 注解引入第三方組件,以便將其納入當(dāng)前的配置管理。
條件注解
條件注解 @ConditionalOnXxx 是 Spring Boot 提供的一組注解,用于根據(jù)特定條件決定是否加載某個(gè) Bean 或配置類。這些注解通常用于自動(dòng)配置,以確保只有在滿足一定條件時(shí),相關(guān)的配置才會(huì)生效。
- @ConditionalOnClass
功能: 判斷特定的類是否在類路徑中。如果指定的類存在,則加載相應(yīng)的 Bean。這對(duì)于可選依賴的支持非常有用。
@Bean
@ConditionalOnClass(name = "com.example.SomeLibrary")
public SomeLibrary someLibrary() {
return new SomeLibrary();
}- @ConditionalOnMissingClass
功能: 與 @ConditionalOnClass 相反,判斷特定的類是否不在類路徑中。如果指定的類不存在,則加載相應(yīng)的 Bean。
@Bean
@ConditionalOnMissingClass("com.example.SomeLibrary")
public AlternativeLibrary alternativeLibrary() {
return new AlternativeLibrary();
}- @ConditionalOnBean
功能: 檢查容器中是否存在指定類型或名稱的 Bean。如果存在,則加載當(dāng)前的 Bean。這通常用于確保某些依賴是可用的。
@Bean
@ConditionalOnBean(DataSource.class)
public MyRepository myRepository(DataSource dataSource) {
return new MyRepository(dataSource);
}- @ConditionalOnMissingBean
功能: 檢查容器中是否沒有指定類型或名稱的 Bean。如果不存在,則加載當(dāng)前的 Bean。這用于提供默認(rèn)實(shí)現(xiàn),當(dāng)用戶沒有定義自定義 Bean 時(shí)使用。
@Bean
@ConditionalOnMissingBean(MyService.class)
public MyService myService() {
return new DefaultMyService();
}場景:
● 如果存在 FastsqlException 這個(gè)類,給容器中放?個(gè) Cat 組件,名cat01,
● 否則,就給容器中放?個(gè) Dog 組件,名dog01
● 如果系統(tǒng)中有 dog01 這個(gè)組件,就給容器中放?個(gè) User組件,名zhangsan
● 否則,就放?個(gè)User,名叫l(wèi)isi
// 假設(shè) FastsqlException 是一個(gè)自定義異常類
class FastsqlException extends Exception { }
// Cat 和 Dog 組件
class Cat {
@Override
public String toString() {
return "I am a Cat, named cat01.";
}
}
class Dog {
@Override
public String toString() {
return "I am a Dog, named dog01.";
}
}
// User 組件
class User {
private String name;
public User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User: " + name;
}
}
// 配置類
@Configuration
public class AnimalConfiguration {
// 根據(jù) FastsqlException 的存在與否選擇 Cat 或 Dog
@Bean(name = "cat01")
@ConditionalOnClass(FastsqlException.class) // 如果存在 FastsqlException 類
public Cat cat() {
return new Cat();
}
@Bean(name = "dog01")
@ConditionalOnMissingBean(name = "cat01") // 如果不存在 Cat,則創(chuàng)建 Dog
public Dog dog() {
return new Dog();
}
// 根據(jù) dog01 的存在與否選擇 User
@Bean(name = "zhangsan")
@ConditionalOnBean(name = "dog01") // 如果存在 dog01
public User userZhangsan() {
return new User("zhangsan");
}
@Bean(name = "lisi")
@ConditionalOnMissingBean(name = "zhangsan") // 如果不存在 zhangsan
public User userLisi() {
return new User("lisi");
}
}屬性綁定
@ConfigurationProperties
功能: 用于將配置文件中的屬性綁定到 Java 類的字段。它可以幫助我們將外部配置(如 application.properties 或 application.yml 文件)映射到一個(gè) POJO(Plain Old Java Object)中,從而方便地獲取和使用這些配置信息。
使用方式:
- 需要在類上使用 @ConfigurationProperties 注解,并指定一個(gè)前綴,Spring Boot 會(huì)根據(jù)這個(gè)前綴匹配配置文件中的屬性。
- 該類通常會(huì)被標(biāo)記為 @Component 或通過其他方式(例如在配置類中注冊)納入 Spring 容器管理。
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private int version;
....
}
在 application.properties 文件中,可以這樣配置:
app.name=My Application app.version=1
@EnableConfigurationProperties
功能: 用于快速注冊使用 @ConfigurationProperties 注解的類。它可以讓 Spring 自動(dòng)掃描并注冊這些配置屬性類。通常在主應(yīng)用程序類或配置類上使用。
使用方式: 只需在配置類或主應(yīng)用程序類上添加此注解,并傳入希望注冊的配置類。
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private int version;
....
}
@SpringBootApplication
@EnableConfigurationProperties(AppConfig.class) // 注冊 AppConfig 一般用于導(dǎo)入第三方寫好的組件進(jìn)行數(shù)據(jù)綁定
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
在 Spring Boot 中,默認(rèn)情況下只有主程序所在的包及其子包會(huì)被掃描。這意味著如果我們導(dǎo)入了第三方庫的組件,即使這些組件上標(biāo)注了 @Component 或 @ConfigurationProperties 注解,它們也不會(huì)被自動(dòng)注冊到 Spring 容器中。為了解決這個(gè)問題,我們可以使用 @EnableConfigurationProperties 注解來快速進(jìn)行屬性綁定,并將這些組件注冊到容器中。這樣,我們就能夠有效地管理和使用來自第三方庫的配置屬性。
要將 Spring 容器中任意組件(Bean)的屬性值與配置文件中的配置項(xiàng)進(jìn)行綁定,可以按照以下步驟進(jìn)行:
- 注冊組件: 使用 @Component 或 @Bean 注解將組件注冊到 Spring 容器中。
- 使用 @ConfigurationProperties: 在組件上添加 @ConfigurationProperties 注解,聲明需要綁定的配置項(xiàng)的前綴,以便將配置文件中的相應(yīng)屬性值映射到該組件的屬性中。
@SpringBootApplication 是一個(gè)用于簡化 Spring Boot 應(yīng)用程序配置的復(fù)合注解,它實(shí)際上由三個(gè)核心注解組成:
1.@SpringBootConfiguration:
- 這是 @Configuration 的一個(gè)特化,表示該類是 Spring Boot 應(yīng)用程序的主配置類。它允許我們定義 Spring 上下文中的 Bean,并可以通過 Java 配置的方式進(jìn)行應(yīng)用程序的設(shè)置。
2.@EnableAutoConfiguration:
- 這個(gè)注解啟用了 Spring Boot 的自動(dòng)配置功能。根據(jù)項(xiàng)目的依賴和類路徑,Spring Boot 會(huì)自動(dòng)配置應(yīng)用所需的各種組件。例如,如果檢測到某個(gè)數(shù)據(jù)庫驅(qū)動(dòng)存在,Spring Boot 會(huì)自動(dòng)配置數(shù)據(jù)源和相關(guān)的 JPA 設(shè)置。通過這個(gè)注解,開發(fā)者無需手動(dòng)配置許多常見的設(shè)置,從而加快開發(fā)速度。
3.@ComponentScan:
- 該注解告訴 Spring 在指定的包及其子包中掃描帶有 @Component、@Service、@Repository 和 @Controller 等注解的組件。這允許 Spring 自動(dòng)發(fā)現(xiàn)并注冊這些組件為 Spring 容器中的 Bean。默認(rèn)情況下,它會(huì)掃描注解所在類的包。
總結(jié)
通過本文,我們對(duì) Spring Boot 有了全面的了解,包括如何快速啟動(dòng)項(xiàng)目、分析其應(yīng)用場景以及掌握常用注解的使用方法。Spring Boot 提供的自動(dòng)配置和約定優(yōu)于配置的理念,使得開發(fā)流程更加高效和靈活。無論是初學(xué)者還是經(jīng)驗(yàn)豐富的開發(fā)者,都能從中受益。
到此這篇關(guān)于Spring Boot快速入門、應(yīng)用分析、常用注解的文章就介紹到這了,更多相關(guān)springboot常用注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java冷知識(shí):javac AbstractProcessor詳解
這篇文章主要介紹了java冷知識(shí):javac AbstractProcessor詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
SpringCloud-Hystrix-Dashboard客戶端服務(wù)監(jiān)控的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringCloud-Hystrix-Dashboard客戶端服務(wù)監(jiān)控的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Java實(shí)現(xiàn)更新順序表中的指定元素的示例
本文主要介紹了Java實(shí)現(xiàn)更新順序表中的指定元素的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java深入了解數(shù)據(jù)結(jié)構(gòu)中常見的排序算法
這篇文章主要介紹了Java常用的排序算法及代碼實(shí)現(xiàn),在Java開發(fā)中,對(duì)排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來詳細(xì)說說Java常見的排序算法,需要的朋友可以參考一下2022-01-01
20秒教你學(xué)會(huì)java?List函數(shù)排序操作示例
這篇文章主要為大家介紹了20秒教你學(xué)會(huì)List函數(shù)排序操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

