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。

 

posted @ 2022-10-19 11:20  山阴路的秋天  阅读(821)  评论(0编辑  收藏  举报