可以使用 spring spi 和 import 兩種方法
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 的路徑
- META-INF/spring.factories 檔案的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 鍵下
- 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);
}
}