溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Spring Boot Starter的簡(jiǎn)介及用法是怎樣的

發(fā)布時(shí)間:2021-09-29 15:07:53 來(lái)源:億速云 閱讀:132 作者:柒染 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Spring Boot Starter的簡(jiǎn)介及用法是怎樣的,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Spring Boot 的便利性體現(xiàn)在,它簡(jiǎn)化了很多煩瑣的配置,這對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)是一個(gè)福音,通過(guò)引入各種 Spring Boot Starter 包可以快速搭建出一個(gè)項(xiàng)目的腳手架。

目前提供的 Spring Boot Starter 包有:

  • spring-boot-starter-web:快速構(gòu)建基于 Spring MVC 的 Web 項(xiàng)目,使用 Tomcat 做默認(rèn)嵌入式容器。

  • spring-boot-starter-data-redis:操作 Redis。

  • spring-boot-starter-data-mongodb:操作 Mongodb。

  • spring-boot-starter-data-jpa:操作 Mysql

  • spring-boot-starter-activemq:操作 Activemq。



自動(dòng)配置非常方便,當(dāng)我們要操作 Mongodb 的時(shí)候,只需要引入 spring-boot-starter-data-mongodb 的依賴(lài),然后配置 Mongodb 的鏈接信息 spring.data.mongodb.uri=mongodb://localhost/test 就可以使用 MongoTemplate 來(lái)操作數(shù)據(jù),MongoTemplate 的初始化工作全部交給 Starter 來(lái)完成。

自動(dòng)配置麻煩的是當(dāng)出現(xiàn)錯(cuò)誤時(shí),排查問(wèn)題的難度上升了。自動(dòng)配置的邏輯都在 Spring Boot Starter 中,要想快速定位問(wèn)題,就必須得了解 Spring Boot Starter 的內(nèi)部原理。接下來(lái)我們自己動(dòng)手來(lái)實(shí)現(xiàn)一個(gè) Spring Boot Starter。

Spring Boot Starter項(xiàng)目創(chuàng)建

創(chuàng)建一個(gè)項(xiàng)目 spring-boot-starter-demo,pom.xml 配置代碼如下所示。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>

創(chuàng)建一個(gè)配置類(lèi),用于在屬性文件中配置值,相當(dāng)于 spring.data.mongo 這種形式,代碼如下所示。

import org.springframework.boot.context.properties.ConfigurationProperties;import lombok.Data;@Data@ConfigurationProperties("spring.user")public class UserPorperties {private String name;
}

再定義一個(gè) Client,相當(dāng)于 MongoTemplate,里面定一個(gè)方法,用于獲取配置中的值,代碼如下所示。

public class UserClient {private UserPorperties userPorperties;public UserClient() {

    }public UserClient(UserPorperties p) {this.userPorperties = p;
    }public String getName() {return userPorperties.getName();
    }
}

自動(dòng)創(chuàng)建客戶(hù)端

一個(gè)最基本的 Starter 包定義好了,但目前肯定是不能使用 UserClient,因?yàn)槲覀儧](méi)有自動(dòng)構(gòu)建 UserClient 的實(shí)例。接下來(lái)開(kāi)始構(gòu)建 UserClient,代碼如下所示。

@Configuration@EnableConfigurationProperties(UserPorperties.class)
public class UserAutoConfigure {@Bean@ConditionalOnProperty(prefix = "spring.user", value = "enabled", havingValue = "true")
    public UserClient userClient(UserPorperties userPorperties) {return new UserClient(userPorperties);
    }
}

Spring Boot 會(huì)默認(rèn)掃描跟啟動(dòng)類(lèi)平級(jí)的包,假如我們的 Starter 跟啟動(dòng)類(lèi)不在同一個(gè)主包下,如何能讓 UserAutoConfigure 生效?

在 resources 下創(chuàng)建一個(gè) META-INF 文件夾,然后在 META-INF 文件夾中創(chuàng)建一個(gè) spring.factories 文件,文件中指定自動(dòng)配置的類(lèi):

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cxytiandi.demo.UserAutoConfigure

Spring Boot 啟動(dòng)時(shí)會(huì)去讀取 spring.factories 文件,然后根據(jù)配置激活對(duì)應(yīng)的配置類(lèi),至此一個(gè)簡(jiǎn)單的 Starter 包就實(shí)現(xiàn)了。

使用 Starter

現(xiàn)在可以在其他的項(xiàng)目中引入這個(gè) Starter 包,代碼如下所示。

<dependency><groupId>com.cxytiandi</groupId><artifactId>spring-boot-starter-demo</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

引入之后就直接可以使用 UserClient,UserClient 在項(xiàng)目啟動(dòng)的時(shí)候已經(jīng)自動(dòng)初始化好,代碼如下所示。

@RestControllerpublic class UserController {@Autowiredprivate UserClient userClient;@GetMapping("/user/name")public String getUserName() {return userClient.getName();
    }
}

屬性文件中配置 name 的值和開(kāi)啟 UserClient:

spring.user.name=zhangsanspring.user.enabled=true

訪問(wèn) /user/name 就可以返回我們配置的 zhangsan。

使用注解開(kāi)啟 Starter 自動(dòng)構(gòu)建

很多時(shí)候我們不想在引入 Starter 包時(shí)就執(zhí)行初始化的邏輯,而是想要由用戶(hù)來(lái)指定是否要開(kāi)啟 Starter 包的自動(dòng)配置功能,比如常用的 @EnableAsync 這個(gè)注解就是用于開(kāi)啟調(diào)用方法異步執(zhí)行的功能。

同樣地,我們也可以通過(guò)注解的方式來(lái)開(kāi)啟是否自動(dòng)配置,如果用注解的方式,那么 spring.factories 就不需要編寫(xiě)了,下面就來(lái)看一下怎么定義啟用自動(dòng)配置的注解,代碼如下所示。

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import({UserAutoConfigure.class})
public @interface EnableUserClient {

}

這段代碼的核心是 @Import({UserAutoConfigure.class}),通過(guò)導(dǎo)入的方式實(shí)現(xiàn)把 UserAutoConfigure 實(shí)例加入 SpringIOC 容器中,這樣就能開(kāi)啟自動(dòng)配置了。

使用方式就是在啟動(dòng)類(lèi)上加上該注解,代碼如下所示。

@SpringBootApplicationpublic class SpringBootDemoApplication {public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }
}

使用配置開(kāi)啟 Starter 自動(dòng)構(gòu)建

在某些場(chǎng)景下,UserAutoConfigure 中會(huì)配置多個(gè)對(duì)象,對(duì)于這些對(duì)象,如果不想全部配置,或是想讓用戶(hù)指定需要開(kāi)啟配置的時(shí)候再去構(gòu)建對(duì)象,這個(gè)時(shí)候我們可以通過(guò) @ConditionalOnProperty 來(lái)指定是否開(kāi)啟配置的功能,代碼如下所示。

@Bean@ConditionalOnProperty(prefix = "spring.user",value = "enabled",havingValue = "true")
public UserClient userClient(UserPorperties userPorperties) {return new UserClient(userPorperties);
}

通過(guò)上面的配置,只有當(dāng)啟動(dòng)類(lèi)加了 @EnableUserClient 并且配置文件中 spring.user.enabled=true 的時(shí)候才會(huì)自動(dòng)配置 UserClient。

配置 Starter 內(nèi)容提示

在自定義 Starter 包的過(guò)程中,還有一點(diǎn)比較重要,就是對(duì)配置的內(nèi)容項(xiàng)進(jìn)行提示,需要注意的是,Eclipse 中是不支持提示的,Spring Tools 4 for Eclipse 中可以提示。

定義提示內(nèi)容需要在 META-INF 中創(chuàng)建一個(gè) spring-configuration-metadata.json 文件,代碼如下所示。

{ "properties": [ { "name": "spring.user.name", "defaultValue": "cxytinadi" }, { "name": "spring.user.enabled", "type": "java.lang.Boolean", "defaultValue": false } ] }
  • name:配置名

  • type:配置的數(shù)據(jù)類(lèi)型

  • defaultValue:默認(rèn)值

上述就是小編為大家分享的Spring Boot Starter的簡(jiǎn)介及用法是怎樣的了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI