天天看點

自定義springboot starter

我們在使用springboot的時候,感覺特别的友善易用。原因就是springboot官方提供了很多starter,我們需要使用什麼功能,隻需要引入對應的starter就可以了,大大簡化了配置,這就是springboot當中約定大于配置特性。

那麼這些starter到底是如何工作的呢?下面我們來自建一個自己的springboot starter,進而對裡面的特性一探究竟。

項目名稱

    spring官方的starter的名稱一般都是下面的格式:spring-boot-starter-xxxxx,例如spring-boot-starter-actuator、spring-boot-starter-web

    而非官方的starter官方建議命名為:xxxxx-spring-boot-starter,是以建立一個springboot工程,命名這個工程為:userdefined-spring-boot-starter

pom檔案

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.fsl</groupId>
    <artifactId>userdefined-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>userdefined-spring-boot-starter</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging><!-- 必須有這個設定,否則無法執行maven install打包到maven倉庫供别人引用 -->
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
    <!-- starter的依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>
           

自定義的配置屬性

@ConfigurationProperties("my.defined")
public class MyDefinedProperties {
    /**
     * 姓名
     */
    private String name;
    /**
     * 年齡
     */
    private Integer age;
    /**
     * 家鄉位址
     */
    private String hometown;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getHometown() {
        return hometown;
    }
    public void setHometown(String hometown) {
        this.hometown = hometown;
    }
    @Override
    public String toString() {
        return "MyDefinedProperties{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hometown='" + hometown + '\'' +
                '}';
    }
}
           

自定義的service

public class MyDefinedService {
    MyDefinedProperties myDefinedProperties;
    public MyDefinedProperties getMyDefinedProperties() {
        return myDefinedProperties;
    }
    public void setMyDefinedProperties(MyDefinedProperties helloProperties) {
        this.myDefinedProperties = helloProperties;
    }
    public String sayHello() {
        return String.format("[name=%s, age=%d, hometown=%s]",
                myDefinedProperties.getName(),
                myDefinedProperties.getAge(),
                myDefinedProperties.getHometown());
    }
}
           

加載service

@Configuration
//web工程生效
@ConditionalOnWebApplication
@EnableConfigurationProperties(MyDefinedProperties.class)
public class MyDefinedServiceAutoConfiguration {
    @Autowired
    MyDefinedProperties myDefinedProperties;
    @Bean
    @ConditionalOnMissingBean(MyDefinedService.class)
    @ConditionalOnProperty//存在對應配置資訊時初始化該配置類
            (
                    prefix = "my.defined",//存在配置字首my.defined
                    name = "enabled",
                    havingValue = "true",//開啟
                    matchIfMissing = true//缺失檢查
            )
    public MyDefinedService myDefinedService2() {
        MyDefinedService service = new MyDefinedService();
        service.setMyDefinedProperties(myDefinedProperties);
        return service;
    }
}
           

 配置啟動類

    在resources目錄下面,建立META-INF檔案夾,裡面建立spring.factories檔案,檔案内容如下:

#配置自定義Starter的自動化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.fsl.userdefinedspringbootstarter.MyDefinedServiceAutoConfiguration
           

執行maven insatll打包指令

    項目的整體結構如下:

自定義springboot starter

    執行maven install指令打包項目

自定義springboot starter

别的項目引用這個starter

    在另外的工程當中引入對應的依賴

<!--引入自定義的starter-->
<dependency>
   <groupId>com.fsl</groupId>
   <artifactId>userdefined-spring-boot-starter</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</dependency>
           

配置屬性

#設定自定義starter的參數
my.defined.name=ydd
my.defined.age=18
my.defined.hometown=jiangxi
my.defined.enabled = true
           

可以直接注入上面的service

@RestController
public class IndexController {

    @Autowired
    private MyDefinedService myDefinedService;

    @GetMapping("/index")
    public String index(){
        return myDefinedService.sayHello();
    }
}
           

運作結果

自定義springboot starter

繼續閱讀