首頁 > 軟體

springboot 自定義啟動器的實現

2023-02-03 18:03:38

建立自定義啟動器

0、專案總覽

1、建立專案,引入依賴

建立專案 spring-boot-jdbc-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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.shwen</groupId>
  <artifactId>spring-boot-jdbc-starter</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>spring-boot-jdbc-starter</name>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <!--引入spring‐boot‐starter;所有starter的基本設定-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!--自動設定連線池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>

    <dependency>
      <groupId>c3p0</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.1.2</version>
    </dependency>

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

</project>

啟動器支援多種資料來源,例如:C3P0和Druid,根據設定的type進行選擇。此處我們參照兩個連線池依賴,一個是C3P0,一個是Druid。

2、建立屬性設定類

package com.shwen.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.jdbc.datasource")
public class DataSourceProperties {
    private String driverClassName;
    private String url;
    private String username;
    private String password;

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "DataSourceProperties{" +
                "driverClassName='" + driverClassName + ''' +
                ", url='" + url + ''' +
                ", username='" + username + ''' +
                ", password='" + password + ''' +
                '}';
    }
}

屬性設定類注入 application.yml 檔案中的設定資訊。

3、建立自動設定類

package com.shwen.autoconfig;

import ...
import javax.sql.DataSource;

@SpringBootConfiguration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    @Autowired
    private DataSourceProperties dataSourceProperties ;

    @Bean
    @ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "druid")
    public DataSource createDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
        dataSource.setUrl(dataSourceProperties.getUrl());
        dataSource.setUsername(dataSourceProperties.getUsername());
        dataSource.setPassword(dataSourceProperties.getPassword());
        return dataSource;
    }

    @Bean
    @ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "c3p0")
    public DataSource createC3P0DataSource() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(dataSourceProperties.getDriverClassName());
        dataSource.setJdbcUrl(dataSourceProperties.getUrl());
        dataSource.setUser(dataSourceProperties.getUsername());
        dataSource.setPassword(dataSourceProperties.getPassword());
        return dataSource;
    }
}
  • 如果組態檔中設定了spring.jdbc.datasource.type=c3p0,使用 c3p0 資料來源。
  • 如果組態檔中設定了spring.jdbc.datasource.type=druid,使用 druid 資料來源。

此處使用條件選擇實現,@ConditionalOnProperty(value = "spring.jdbc.datasource.type",havingValue = "druid") 根據組態檔中的 type 值進行條件選擇建立不同的 DataSource

4、建立自動設定屬性檔案

resource資料夾下面新建 META-INF/spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.shwen.autoconfig.DataSourceAutoConfiguration

注意要執行 install ,安裝專案。

使用自定義啟動器

1、springboot_01 專案引入自定義啟動器

pom檔案:

<dependency>
  <groupId>com.shwen</groupId>
  <artifactId>spring-boot-jdbc-starter</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

2、設定連線池資訊

application.yml

組態檔設定 type 指定需要建立的資料來源,此處指定資料來源為druid,並且設定連線屬性資訊。

3、注入屬性測試

@RestController
public class HelloController {

    @Autowired
    private DataSource dataSource;

    @RequestMapping(path = "/hello2")
    public String sayHello2() throws SQLException {
        System.out.println(dataSource.getClass());
        
        DruidDataSource dds = (DruidDataSource) dataSource;
        System.out.println(dds.getPassword());
        return "hello spring boot";
    }
}

注入DataSource,檢視連線池屬性。

存取 http://127.0.0.1:8080/hello2,列印結果:

小結

通過編寫自定義啟動器,我們更加理解springboot自動設定原理。springboot專案啟動後,

  • 會讀取所有依賴的 jar 包下面 META-INF/spring.factories 檔案,而該檔案設定了自動設定類,將 spring.factories 中的設定類的全名稱獲取到,並且根據載入條件來載入專案所需要的類。
  • 通過反射範例化標註了@Configuration的 IOC容器設定類,然後彙總並載入到 IOC 容器。當收集到所有在 spring.factories 中指定的bean後,再通過@Import註解將其匯入進容器。
  • @ConfigurationProperties註解會讀取組態檔 application.yml 裡面屬性,將讀到的值繫結到被註解類的屬性。然後,@EnableConfigurationProperties將屬性設定類注入到 IOC 容器中,這樣當專案需要設定資訊的時候可以直接從容器中去取。
  • 至此,依賴的 jar 包中自動設定類注入成功,專案可以直接通過@Autowired裝配使用。

到此這篇關於springboot 自定義啟動器的實現的文章就介紹到這了,更多相關springboot 自定義啟動器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com