java 自定义starter 实现
日常开发中,经常会有独立于业务之外的配置模块,可能多个项目公用该配置,例如内容审核,短信登录等,如果在每个项目中多次引用太过麻烦。因此我们可以将配置模块封装为starter,需要时在模块pom中添加该依赖,方便复用。
命名规则:
SpringBoot提供的starter以 spring-boot-starter-xxx 的方式命名的。
官方建议自定义的starter使用 xxx-spring-boot-starter 命名规则。
测试demo如下:
1.新建module:wl-spring-boot-starter
pom.xml 中引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency>
2.添加测试bean
@Data @Configuration public class MyProperties { @Value("${wl.name}") private String name; @Value("${wl.age}") private Integer age; }
3. 添加配置类
@Configuration public class MyAutoConfiguration { static { System.out.println("MyAutoConfiguration init...."); } @Bean public MyProperties myProperties() { return new MyProperties(); } }
4. resources下创建/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyAutoConfiguration
starter 项目结构如下:
到此starter 项目简单配置就已完成,使用该sterter 就在相关项目pom 中引入该starter。
5. pom 引入该starter
<dependency>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
6.创建测试类测试
@SpringBootTest public class DemoTest { @Autowired private MyProperties myProperties; @Test public void test() { System.out.println(JSON.toJSONString(myProperties)); } }
application.yml 中添加配置:
wl:
name: 张三
age: 18
至此 ,简单的starter 配置以及使用就完成了。
扩展: 通过热拔插注解方式控制starter 注入
1.添加一个标记类:
public class ConfigMarker { }
2.添加注解类:@import 引入标记类
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(ConfigMarker.class) public @interface EnableRegisterServer { }
3. 在配置类MyAutoConfiguration中 添加条件注解@ConditionalOnBean ,意思是当上下文存在该bean 时,该标注的类会被实例化。
@Configuration @ConditionalOnBean(ConfigMarker.class) public class MyAutoConfiguration { static { System.out.println("MyAutoConfiguration init...."); } @Bean public MyProperties myProperties() { return new MyProperties(); } }
4. 这时在使用该starter时需要在主启动入口添加注解 @EnableRegisterServer 标识引入该starter ,否则项目启动时不会引入该starter。