1. 程式人生 > 其它 >springboot:手寫starter

springboot:手寫starter

技術標籤:積累總結spring bootjavaspring

springboot的每一個starter可以看作是一組依賴的集合,能夠作為單獨的模組提供特定功能,其實現的思路就是自定義一個工程,根據需求新增相關依賴,然後編寫自動配置類,最後打包供其它專案使用。

一、新建maven工程,在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.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.test.starter</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>starter</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

其中spring-boot-starter是必須新增的,其它根據實際情況

二、編寫配置類

@ConfigurationProperties(prefix = "start.demo")
@Data
public class StartDemoProperties {

    private String url = "www.baidu.com";
}

這個類專門儲存yml配置檔案裡的配置,@ConfigurationProperties註解作用是根據prefix的值獲取配置檔案裡的配置並對映到屬性上,然後交給spring容器管理

@Configuration
@EnableConfigurationProperties(StartDemoProperties.class)
public class StartDemoConfig {

    @Resource
    private StartDemoProperties startDemoProperties;

    @Bean
    @ConditionalOnMissingBean
    public HttpClientDemo httpClient() {
        HttpClientDemo httpClientDemo = new HttpClientDemo();
        httpClientDemo.setUrl(startDemoProperties.getUrl());
        return httpClientDemo;
    }
}

這個類是實現自動配置的功能,@Configuration註解代表該類是配置類,交給spring容器管理;@EnableConfigurationProperties(StartDemoProperties.class)註解是讓括號裡的配置類生效;@Bean註解代表該方法返回的bean交給spring容器管理;@ConditionalOnMissingBean註解代表返回的bean不存在時才生效

貼一下demo功能類HttpClientDemo的程式碼

@Data
public class HttpClientDemo {

    private String url;

    public String getHtml() {
        try {
            URL url = new URL(this.url);
            URLConnection urlConnection = url.openConnection();
            BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));
            String line = null;
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "錯誤";
    }
}

三、資原始檔配置

在resources目錄下新建資料夾META-INF,在該資料夾下新建名字為spring.factories的檔案,這個檔案的值是以鍵值形式儲存的

EnableAutoConfiguration就是springboot特有的自動配置類,值為自定義編寫的配置類

四、打包使用

使用maven的import命令將該專案打包並安裝到本地倉庫,或者提交到遠端私服,在其它專案使用時只需要新增依賴即可

五、擴充套件

springboot是如何實現這些自動配置呢?

springboot的啟動類有一個註解:

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)

它是@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan的組合註解,exclude屬性代表排除某個自動配置類

@SpringBootConfiguration代表該類是springboot的配置類

@ComponentScan是spring的自動掃描

@EnableAutoConfiguration是核心註解,表示自動配置

@EnableAutoConfiguration分析

該註解內部使用了@Import({AutoConfigurationImportSelector.class}),這個註解會匯入AutoConfigurationImportSelector.class類,正是這個類實現了自動配的的功能,該類的selectImports()方法是執行入口,呼叫getAutoConfigurationEntry()方法獲取自動配置,其中的getCandidateConfigurations()方法呼叫了spring的SpringFactoriesLoader.loadFactoryNames()方法來獲取專案下所有Jar包的spring.factories檔案裡的配置類,然後排除掉exclude屬性設定的類