CheatSheet@xyzwps

Spring Boot 如何创建自己的 Starter

一般来说,每个 starter 都属于一个单独的模块。

有几种方式创建自己的 starter:

创建 Enable* 风格的 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 了。

戳这里查看完整代码

创建自动配置的 Starter

这种方式使用 @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 中

使用自定义 Starter

@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);
    }
}

戳这里查看完整代码