springboot自定義starter方法及註解實例

SpringBoot starter

用瞭springboot 那麼久瞭居然都還沒自定義過starter,想想都覺得羞愧,所以今天來玩一下。

SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統一集成進starter,應用者隻需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息並啟動相應的默認配置。starter讓我們擺脫瞭各種依賴庫的處理,需要配置各種信息的困擾。

SpringBoot會自動通過classpath路徑下的類發現需要的Bean,並註冊進IOC容器。SpringBoot提供瞭針對日常企業應用研發各種場景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認配置,並允許我們調整這些配置,即遵循“約定大於配置”的理念。

自定義starter

日常工作中有時有一些獨立於業務之外的功能或模塊,可能這個項目在用,另一個項目也要用,如果每次都重新集成的話就會很麻煩,這時我們隻要把這些功能或模塊封裝成一個個starter的話,在使用的時候引入進去就很方便瞭。

自定義starter步驟

其實自定義starter很簡單,大致需要以下5步:

  • 新建兩個模塊,命名規范: springboot自帶的starter命名規范為spring-boot-starter-xxx, 自定義的starter命名規范為xxx-spring-boot-starter

 xxx-spring-boot-autoconfigure:自動配置核心代碼

 xxx-spring-boot-starter:管理依賴

如果不需要將自動配置代碼和依賴項管理分離開來,則可以將它們組合到一個模塊中。隻不過springboot

官方建議將兩個模塊分開。

  • 2. 引入spring-boot-autoconfigure依賴
  • 3. 創建自定義的XXXProperties 類: 這個類的屬性根據需要是要出現在配置文件中的。
  • 4. 創建自定義的XXXAutoConfiguration類:這個類要配置自動配置時的一些邏輯,同時也要讓XXXProperties 類生效。
  • 5. 創建自定義的spring.factories文件:在resources/META-INF創建一個spring.factories文件和spring-configuration-metadata.json,spring-configuration-metadata.json文件是用於在填寫配置文件時的智能提示,可要可不要,有的話提示起來更友好。spring.factories用於導入自動配置類,必須要有

實現

我這裡為瞭方便就隻創建一個模塊瞭,

  • 創建一個模塊,命名為spring-boot-starter-myStarter,對應pom文件
	<groupId>com.example</groupId>
	<artifactId>spring-boot-starter-myStarter</artifactId>
	<version>1.0</version>
	<name>my-starter</name>
  • 引入spring-boot-autoconfigure依賴 我這裡使用的spring-boot-autoconfigure版本是2.6.2
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
			<version>2.6.2</version>
		</dependency>
	</dependencies>
  • 創建自定義的XXXProperties 類
@ConfigurationProperties(prefix = "com.arron")
public class MyStarterProperties {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

再創建一個MyStarterConfig用於讀取MyStarterProperties 裡的屬性

public class MyStarterConfig {
    private MyStarterProperties myStarterProperties;
    private String name;
    public MyStarterConfig(MyStarterProperties myStarterProperties) {
        this.myStarterProperties = myStarterProperties;
    }
    public String getName() {
        return myStarterProperties.getName();
    }
    public void setName(String name) {
        this.name = name;
    }
}
  • 創建自定義的XXXAutoConfiguration類
@Configuration
// EnableConfigurationProperties value數組中的配置類起作用
@EnableConfigurationProperties(value = {MyStarterProperties.class})
public class MyStarterAutoConfiguration {
    @Autowired
    private MyStarterProperties myStarterProperties;
    @Bean
    @ConditionalOnMissingBean(MyStarterConfig.class)
    public MyStarterConfig myStarterConfig(){
        return new MyStarterConfig(myStarterProperties);
    }
}
  • 在resources/META-INF創建一個spring.factories文件

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.myStarter.MyStarterAutoConfiguration

spring-configuration-metadata.json

{
  "group": [
    {
      "name": "com.arron",
      "type": "com.example.myStarter.MyStarterProperties",
      "sourceType": "com.example.myStarter.MyStarterProperties"
    }
  ],
  "properties": [
    {
      "name": "com.arron.name",
      "type": "java.lang.String",
      "description": "my start name",
      "sourceType": "com.example.myStarter.MyStarterProperties",
      "defaultValue": "MyStarterProperties name"
    }
  ]
}

打包測試

找到如圖maven,點擊install,安裝到本地

然後新建一個項目導包進行測試,創建項目過程就不介紹瞭。

  • 引入依賴
	<dependency>
       <groupId>com.example</groupId>
       <artifactId>spring-boot-starter-myStarter</artifactId>
       <version>1.0</version>
   </dependency>
  • 配置文件添加屬性:
com:
  arron:
    name: myname
  • 單元測試:
@RunWith(SpringRunner.class)
@SpringBootTest
class RabbitmqApplicationTests {
    @Autowired
    private MyStarterConfig myStarterConfig;
    @Test
    public void testMyStarter(){
        String name = myStarterConfig.getName();
        System.out.println(name);
    }
}

控制臺輸出:

myname

至此,一個簡單自定義的springboot starter就完成瞭。

註解解釋

下面這些註解在自定義starter是可能會用到。

  • @Conditional:按照一定的條件進行判斷,滿足條件給容器註冊bean
  • @ConditionalOnMissingBean:給定的在bean不存在時,則實例化當前Bean
  • @ConditionalOnProperty:配置文件中滿足定義的屬性則創建bean,否則不創建
  • @ConditionalOnBean:給定的在bean存在時,則實例化當前Bean
  • @ConditionalOnClass: 當給定的類名在類路徑上存在,則實例化當前Bean
  • @ConditionalOnMissingClass :當給定的類名在類路徑上不存在,則實例化當前Bean

以上就是springboot自定義starter方法詳解的詳細內容,更多關於springboot自定義starter的資料請關註WalkonNet其它相關文章!

推薦閱讀: