您好,登錄后才能下訂單哦!
這期內(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。
創(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(); } }
一個(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)了。
現(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。
很多時(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); } }
在某些場(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 包的過(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è)資訊頻道。
免責(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)容。