( 十二 ) SpringBoot 自定义 Starter

( 十二 )  SpringBoot 自定义 Starter

 

 

1、简介

    在前面的文章中 《( 八 ) SpringBoot 自动配置原理解析》、《( 十一 )SpringBoot @Conditional 条件注解》 我们了解了SpringBoot 自动配置的核心原理与条件注解,本文章中我们来自定义一个我们自己的Starter。

 

2、定义自己的 Starter

1、所谓的 Starter ,其实就是一个普通的 Maven 项目,因此我们自定义 Starter ,需要首先创建一个普通的 Maven 项目,创建完成后,添加 Starter 的自动化配置类即可,如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.1.4.RELEASE</version>
</dependency>

2、配置完成后,我们首先创建一个 HelloProperties 类,用来接受 application.properties 中注入的值,如下:

@ConfigurationProperties(prefix = "com.dw")
public class HelloProperties {
    private static final String DEFAULT_NAME = "世界你好";
    private static final String DEFAULT_MSG = "学如逆水行舟";
    private String name = DEFAULT_NAME;
    private String msg = DEFAULT_MSG;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

3、application.properties 中

com.dw.name=dwTest
com.dw.msg=helloStarter

4、配置完成 HelloProperties 后,接下来我们来定义一个 HelloService ,然后定义一个简单的 say 方法, HelloService 的定义如下:

public class HelloService {
    private String msg;
    private String name;
    public String sayHello() {
        return name + " say " + msg + " !";
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

5、接下来就是我们的重轴戏,自动配置类的定义:

@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {
    @Autowired
    HelloProperties helloProperties;

    @Bean
    HelloService helloService() {
        HelloService helloService = new HelloService();
        helloService.setName(helloProperties.getName());
        helloService.setMsg(helloProperties.getMsg());
        return helloService;
    }
}

关于这一段自动配置,解释如下:

  • 首先 @Configuration 注解表明这是一个配置类。
  • @EnableConfigurationProperties 注解是使我们之前配置的 @ConfigurationProperties 生效,让配置的属性成功的进入 Bean 中。
  • @ConditionalOnClass 表示当项目当前 classpath 下存在 HelloService 时,后面的配置才生效。
  • 自动配置类中首先注入 HelloProperties ,这个实例中含有我们在 application.properties 中配置的相关数据。
  • 提供一个 HelloService 的实例,将 HelloProperties 中的值注入进去

6、做完这一步之后,我们的自动化配置类就算是完成了,接下来还需要一个 spring.factories 文件

我们首先在 Maven 项目的 resources 目录下创建一个名为 META-INF 的文件夹,然后在文件夹中创建一个名为 spring.factories 的文件(为啥需要这个文件,可以参考前面的文章( 八 ) SpringBoot 自动配置原理解析),文件内容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration = com.dw.study.HelloServiceAutoConfiguration

在这里指定我们的自动化配置类的路径即可。如此之后我们的自动化配置类就算完成了。

 

 

3、使用我们自定义的Starter

打包我们刚才的项目到本地, 或者上传到 Maven 私服上,供其他同事下载使用

 

 

 接下来,我们来新建一个普通的 Spring Boot 工程,这个 Spring Boot 创建成功之后,加入我们自定义 Starter 的依赖,如下:

<dependency>
    <groupId>com.dw.study</groupId>
    <artifactId>mystarter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

此时我们引入了上面自定义的 Starter ,也即我们项目中现在有一个默认的 HelloService 实例可以使用,而且关于这个实例的数据,我们还可以在 application.properties 中进行配置,如下:

com.dw.name=饭冰冰
com.dw.msg= 我爱你

配置完成后,方便起见,我这里直接在单元测试方法中注入 HelloSerivce 实例来使用,代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MystarterApplicationTests {

    @Autowired
    HelloService helloService;
    @Test
    public void contextLoads() {
        System.out.println(helloService.sayHello());
    }
}

好了,一个简单的自动化配置类我们就算完成了,是不是很简单!

 

posted @ 2021-08-07 15:23  邓维-java  阅读(154)  评论(0)    收藏  举报