Springboot原理(下)-自動裝配原理實踐和一點思考

Springboot自定義stater

一、前言

在實際的生產環境我們往往會需要自定義一些服務API,集成到Springboot框架中使用,本文以自定義一個Connection數據庫連接對象的stater爲例,來揭開自定義stater的面紗。

二、自定義stater設計

1. 對於Springboot中集成第三方stater的命名規則

官方的stater命名是這樣 : spring-boot-stater-xxx ,比如:

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

第三方的stater命名是這樣:xxx-spring-boot-stater,比如:

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.3</version>
</dependency>

2. 結構設計

在這裏插入圖片描述

三、編碼實現

1. 服務stater端編寫

引入自動配置依賴

<?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.xiaozhi</groupId>
  <artifactId>conn-spring-boot-stater</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>conn-spring-boot-stater</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <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>
    <!-- 這兩個依賴是Springboot自動配置的依賴-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <version>2.0.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <version>2.0.0.RELEASE</version>
      <optional>true</optional>
    </dependency>
  </dependencies>
  <build>

  </build>
</project>

編寫屬性配置類

/**
*	prefix = "jdbc.conn"代表當前類屬性在application.properties配置時key的前綴,比如 url屬性**  未來在application.properties文件中的配置方式爲:
*   jdbc.conn.url=xxxxxx 	
*/
@ConfigurationProperties(prefix = "jdbc.conn")
public class ConnProperties {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
	//此處需要提供getter/setter方法
    ...}

編寫自動配置類

@Configuration
// 這裏引用了上面定義的屬性配置類
@EnableConfigurationProperties(ConnProperties.class)
public class ConnectionAutoConfiguration {
	//採用spring的JavaConfig方式創建服務類
    @Bean
    public Connection conn(ConnProperties connProperties) {
        Connection connection = null;
        try {
            Class.forName(connProperties.getDriverClassName());
            connection = DriverManager.getConnection(connProperties.getUrl(), connProperties.getUsername(), connProperties.getPassword());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
}

編寫META-INF/spring.factories : org.springframework.boot.autoconfigure.EnableAutoConfiguration這個值是固定的, Springboot應用啓動時會根據這個key進行讀取自動配置類

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xiaozhi.autoconfig.ConnectionAutoConfiguration

使用mvn install將服務打包安裝。

2. 服務調用端測試

引入自定義stater依賴

<dependency>
	<groupId>com.xiaozhi</groupId>
	<artifactId>conn-spring-boot-stater</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>

編寫application.properties

jdbc.conn.driver-class-name=oracle.jdbc.OracleDriver
jdbc.conn.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.conn.username=hr
jdbc.conn.password=hr

注入使用Connection

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

    @Autowired
    private Connection connection;

    @Test
    public void testConn() {
        if(connection!=null){
            System.out.println("獲取到Connection:"+connection);
        }
    }
}

本文的案例中使用到了兩個重要註解:
@ConfigurationProperties 和 @EnableConfigurationProperties,這裏要說的是@ConfigurationProperties這個註解在使用Spring的JavaConfig方式開發時,也可以用在帶有@Bean註解的方法上,通過這種方式可以實現給一個應用中原有的屬性配置類自定義配置的方式,比如多數據源的實現:

@Configuration
public class DatasourceConfiguration {
	//第一個數據源
    @Bean
    @Primary // 優先使用這裏的數據源
    @ConfigurationProperties(prefix ="spring.ds.user" )
    public DataSourceProperties userDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    public DataSource userDataSource() {
        return userDataSourceProperties()
            .initializeDataSourceBuilder().type(DruidDataSource.class).build();
    }
	...
    //第二個數據源
    @Bean
    @ConfigurationProperties(prefix ="spring.ds.product" )
    public DataSourceProperties productDataSourceProperties() {
        return new DataSourceProperties();
    }
    @Bean
    public DataSource productDataSource() {
        return productDataSourceProperties()
            .initializeDataSourceBuilder().type(DruidDataSource.class).build();
    }
    ...
}

本文參考自Springboot原理,如有紕漏或不當之處請指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章