一般来说,每个 starter 都属于一个单独的模块。
有几种方式创建自己的 starter:
这种方式需要你在 starter 中创建一个 @EnableXXX
注解,然后把指定的配置文件给 @Import
进去就可以了。比如:
EnableStarterA.java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(StarterAConfiguration.class)
public @interface EnableStarterA {
}
StarterAConfiguration.java
@Configuration
public class StarterAConfiguration {
@Bean
public StarterAService starterAService() {
return new StarterAService();
}
}
在使用时,只需要把 @EnableStarterA
的注解标记到 @SpringBootApplication
旁边,就可以在应用中自动注入 StarterAService
了。
这种方式使用 @AutoConfiguration
注解,主要把标记的此注解的类放到
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中即可。比如:
// 此类全名应写入 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中
@AutoConfiguration
public class StarterBConfiguration {
@Bean
public StarterBService starterBService() {
return new StarterBService();
}
}
在使用时,只需把此 starter 模块加入依赖,就可以自动注入 StarterBService
了。
在 Spring Boot 2.x 版本早期,官方文档中描写的是使用文件
META-INF/spring.factories
。 在 Spring Boot 3.x 中,使用的是META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
。 这个变化发生在 Spring Boot 2.7 中。
@SpringBootApplication
@RestController
@EnableStarterA
public class StartersApp {
@Autowired
private StarterAService starterA;
@Autowired
private StarterBService starterB;
@GetMapping("/messages")
public List<String> getMessages() {
return List.of(starterA.getMessage(), starterB.getMessage());
}
public static void main(String[] args) {
SpringApplication.run(StartersApp.class, args);
}
}