如何手写SpringBoot中的Starter
一、命名规则
自定义 Starter
的命名规则是自由的,但为了保持一致性和易用性,可以遵循以下命名规范:
- 自定义: Starter 的名称以 “×××-spring-boot-starter” 结尾,前跟具体的功能或模块名称,例如
cry-spring-boot-starter
- 官方: Starter 的名称以 “spring-boot-starter-×××” 开头,后跟具体的功能或模块名称,例如
spring-boot-starter-web
二、具体实现
1. model包
-
Animal接口
public interface Animal { String cry(String str); }
-
Cat实现类
@Slf4j public class Cat implements Animal{ @Override public String cry(String str) { log.info("This is a Cat"); return "猫:喵喵喵" + str; } }
-
Dog实现类
@Slf4j public class Dog implements Animal{ @Override public String cry(String str) { log.info("This is a Dog"); return "狗:汪汪汪" + str; } }
2. config包
-
AnimalSetting类:用于获取配置文件中的形如"animal.type=dog"的数据,并自动填充到Bean中
@ConfigurationProperties(prefix = "animal") @Setter @Getter public class AnimalSetting { private String type; }
-
AnimalConfiguration类:关键配置类,根据配置文件中的"animal.type"的不同值,自动创建对应的Cat或Dog类型的Bean对象并交由Spring进行管理
@Configuration @EnableConfigurationProperties(AnimalSetting.class) @Slf4j public class AnimalConfiguration { @Bean @ConditionalOnProperty(prefix = "animal", name = "type", havingValue = "cat") public Cat cat() { log.info("Cat Init"); return new Cat(); } @Bean @ConditionalOnProperty(prefix = "animal", name = "type", havingValue = "dog") public Dog dog() { log.info("Dog Init"); return new Dog(); } }
@EnableConfigurationProperties(AnimalSetting.class): 使AnimalSetting类生效。如果不使用这个注解,也可以在AnimalSetting类上面加
@Component
注解,效果一样@ConditionalOnProperty(prefix = “animal”, name = “type”, havingValue = “dog”): 条件加载注解,当"animal.type=dog"时,创建Dog类型的Bean对象并交由Spring进行管理
3. yml文件
animal:
type: dog
4. Spring.factories文件
在resources
目录下,创建名为META-INF
的文件夹,在此文件夹下创建Spring.factories
文件,文件内容为org.springframework.boot.autoconfigure.EnableAutoConfiguration=×××
,其中×××为配置类的全限定类名
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.aben.cry.config.AnimalConfiguration
5. 安装Starter到本地仓库
6. 引用自定义Starter
<dependency>
<groupId>com.aben.cry</groupId>
<artifactId>cry-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
7. 使用Starter
在引入Starter的项目的application.yml文件中指定"animal.type=cat"或"animal.type=dog",即可注入对应的Animal实现类到Spring容器中,进而完成使用