Starter啟動器
顧名思義循诉,啟動器横辆,一站式啟動然后就可以使用該starter提供的功能了。它包含了某一功能的所有依賴茄猫,比如springboot的web啟動器狈蚤,我們只需要在pom文件中引入該啟動器依賴就可以使用web相關(guān)功能∧即可以通俗的說炫惩,starter是一個功能模塊。
寫一個Starter
接下來阿浓,我們寫一個Starter他嚷。該Starter自動配置一個Bean提供一個打印功能。
項目文件有三個:
- HelloClient 這個是我們的實現(xiàn)類芭毙,實現(xiàn)打印功能筋蓖。
- HelloProperties 屬性類
- HelloWorldAutoConfiguration 該類是自動配置類,創(chuàng)建HelloClient的Bean實例退敦。
創(chuàng)建Maven項目粘咖,該項目是沒有啟動類和test文件夾的。
引入相關(guān)依賴侈百,主要是spring-boot-autoconfigure
和spring-boot-configuration-processor
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.17.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xiucong</groupId>
<artifactId>helloworld-springboot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>helloworld-springboot-starter</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
</project>
- 首先是我們的HelloClient類瓮下,該類的實例將會被我們的自動配置類加入到容器中翰铡,其提供一個打印功能。
package com.xiucong.helloworld;
/**
* @ClassName HelloClient
* @Description TODO
* @Author xiuc_shi
* @Date 2020/8/17 下午 10:26
* @Version 1.0
**/
public class HelloClient {
private String message;
public HelloClient(String message){
this.message = message;
}
public void print(){
System.out.println(message);
}
}
- HelloProperties類讽坏,用
@ConfigurationProperties(prefix = "hello")
指定配置項的前綴锭魔。該類將配置文件中的屬性加載作為自己屬性的值。
package com.xiucong.helloworld;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @ClassName HelloProperties
* @Description TODO
* @Author xiuc_shi
* @Date 2020/8/17 下午 10:28
* @Version 1.0
**/
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
//默認是hello world.路呜,配置文件如果設(shè)置了hello.message的值迷捧,則覆蓋hello world.
private String message = "hello world.";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
- HelloWorldAutoConfiguration自動配置類。在該類中胀葱,我們注意到一個注解
@EnableConfigurationProperties(HelloProperties.class)
使能我們的配置類漠秋,此時配置類實例被注冊到了容器中。然后抵屿,我們可以拿到這個bean從而獲取其屬性值庆锦。
package com.xiucong.helloworld;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* @ClassName HelloWorldAutoConfiguration
* @Description TODO
* @Author xiuc_shi
* @Date 2020/8/17 下午 10:33
* @Version 1.0
**/
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloWorldAutoConfiguration {
@Resource
private HelloProperties properties;
@Bean
@ConditionalOnClass(HelloProperties.class)
public HelloClient helloClient(){
return new HelloClient(properties.getMessage());
}
}
- 在Resources文件夾下創(chuàng)建一個
META-INF
目錄,在該目錄下創(chuàng)建文件spring.factories
,指明自動配置類
org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
com.xiucong.helloworld.HelloWorldAutoConfiguration
- 完成轧葛,使用maven安裝
install
到本地倉庫
測試我們的Starter
創(chuàng)建Springboot應用肥荔,然后引入我們的Starter依賴,該依賴可以見上面pom文件的
<parent>
標簽下方
<groupId>com.xiucong</groupId>
<artifactId>helloworld-springboot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
- 測試結(jié)果