快速建立一個spring-boot-starter

newbieking發表於2024-03-16

可以使用 spring spiimport 兩種方法

1. 匯入 starter 依賴

1.1. maven 管理工具

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

1.2. gradle 管理工具

  implementation 'org.springframework.boot:spring-boot-starter'

2. 使用spring spi

2.2. 建立實體類承載資料

@Data
@Builder
public class MyAuthor {
    private String name;
    private String blogSite;
}

2.2. 建立Properties暴露可選項

@Data
@ConfigurationProperties(prefix = "my.author")
public class MyProperties {

    private String name;
    private String blogSite;
}

2.3. 建立容器元件

@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(name = "author")
    public MyAuthor author(MyProperties myProperties) {
        return MyAuthor.builder()
                .name(myProperties.getName())
                .blogSite(myProperties.getBlogSite())
                .build();
    }

}

2.4. 使用spring spi匯出配置類

spring spi 的路徑

  1. META-INF/spring.factories 檔案的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 鍵下
  2. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration. imports 檔案內 (較新版本的springboot)

由於使用較新版本的springboot,我在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 檔案寫入:

com.example.MyAutoConfiguration

2.5. 使用自動配置的元件

    @Bean
    CommandLineRunner commandLineRunner(MyAuthor author) {
        return args -> {
            System.out.println(author);
        };
    }

3. 使用Import提供可選特性支援

3.1. 建立一個可選的功能特性

可以是 @Configuration, ImportSelector, ImportBeanDefinitionRegistrar, 或者 regular component classes

這裡選擇 ImportSelector 方式實現相關功能

public class MyConfigurationSelector implements ImportSelector {
    private final static String PACKAGE_NAME = "com.example";

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        if (importingClassMetadata.getClassName().startsWith(PACKAGE_NAME)) {
            System.out.printf("[%s]bean name: %s\n", PACKAGE_NAME, importingClassMetadata.getClassName());
        }
        return new String[0];
    }
}

3.2. 建立一個註解使用 @Import 註解匯入功能元件

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyConfigurationSelector.class)
public @interface EnableMyFeature {
}

3.3. 在使用該功能的配置類上使用該註解

例如:

@EnableMyFeature
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

相關文章