1. 程式人生 > >spring boot 使用及最佳實踐

spring boot 使用及最佳實踐

maven插件 port 所有 ide tap file build 內存數據庫 管理

第一部分,spring boot 文檔

Spring boot的使用

使用maven進行構建

用戶可以通過繼承spring-boot-starter-parent來獲取默認的依賴。

l 默認java1.8編譯級別

l 默認UTF-8編碼設置

l 默認的DependencyManagement,繼承與spring-boot-dependencies pom文件,用於管理常用依賴及版本。後續使用添加maven依賴可以省略version信息。

l repackage 配置

l 資源文件過濾

l plugin信息配置(包括exec、shade等)

l application.properties,application.yml文件及profile環境文件(如application-dev.properties或者application-dev.yml等)過濾。

starter parent 繼承:maven文件

<!-- Inherit defaults from Spring Boot -->

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.1.3.RELEASE</version>

</parent>

後續添加starter依賴,可以使用新的版本號進行覆蓋。

也可以通過定義相應的屬性,來覆蓋相應依賴的版本信息。

<properties>
        <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

支持的版本信息可以通過spring-boot-dependencies pom文件來查看。

不通過繼承start-parent來使用

有些時候,通過繼承starter-parent來使用spring boot並不合適,例如,項目有自定義的需要繼承的pom。這種情況下就可以通過使用spring-boot-dependencies pom文件來使用默認依賴(不包括默認插件配置),如下:聲明type為pom,scope為import

<dependencyManagement>
                <dependencies>
                <dependency>
                       <!-- Import dependency management from Spring Boot -->
                       <groupId>org.springframework.boot</groupId>
                       <artifactId>spring-boot-dependencies</artifactId>
                       <version>2.1.3.RELEASE</version>
                       <type>pom</type>
                       <scope>import</scope>
                </dependency>
        </dependencies>
</dependencyManagement>

這種情況下,定義相應的屬性配置,將不再能覆蓋已有版本信息。如果需要,可以通過使用以下方式,以spring-data-releasetrain為例:

<dependencyManagement>
        <dependencies>
                <!-- Override Spring Data release train provided by Spring Boot -->
                <dependency>
                       <groupId>org.springframework.data</groupId>
                       <artifactId>spring-data-releasetrain</artifactId>
                       <version>Fowler-SR2</version>
                       <type>pom</type>
                       <scope>import</scope>
                </dependency>
                <dependency>
                       <groupId>org.springframework.boot</groupId>
                       <artifactId>spring-boot-dependencies</artifactId>
                       <version>2.1.3.RELEASE</version>
                       <type>pom</type>
                       <scope>import</scope>
                </dependency>
        </dependencies>
</dependencyManagement>

Spring boot maven插件使用:

Spring boot包含一個可以將工程打包成可執行jar的maven插件,可以通過如下方式進行添加:

<build>
        <plugins>
                <plugin>
                       <groupId>org.springframework.boot</groupId>
                       <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
        </plugins>
</build>

繼承starter-parent情況下,只配置此插件即可使用。如果需要更改stater-parent中的默認配置屬性,可以通過定義進行覆蓋。

最佳實踐

代碼結構:

避免使用默認包

如果創建的類沒有生命包信息,則類會默認使用默認包,默認包使用在使用諸如@ComponentScan, @EntityScan, 及@SpringBootApplication時可能會引發特殊問題。

官方建議遵循java既有的命名約定規則,使用反轉域名的方式命名包。例如,com.example.project.

應用主類位置

通常我們建議將主類放置於根路徑下,註解@SpringBootApplication 通常放置於主類上,並且作為麽某些掃描的根路徑。如JPA配置的Entity掃描等。

@SpringBootApplication註解包含 @EnableAutoConfiguration@ComponentScan ,可以單獨配置,或者直接使用@SpringBootApplication 簡化配置。

如下,基本工程結構:

com
 +- example
     +- myapplication
         +- Application.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerRepository.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderRepository.java

包含main方法的主類定義如下:

package com.example.myapplication;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class Application {
 
        public static void main(String[] args) {
               SpringApplication.run(Application.class, args);
        }
 
}

配置類@Configuration:

Spring boot傾向使用基於java配置類的配置方式,建議使用主類作為主要的配置位置@Configuration。

引入額外的配置類:

不需要將所有的配置放到一個配置類中,可以通過使用@Import註解引入額外的配置類信息。當然@ComponentScan註解會掃描包含@Configuration註解的配置類。

引入xml配置

如果存在不許使用xml配置的情況,則可以通過@ImportResource註解來進行加載。

自動配置@EnableAutoConfiguration

Spring boot基於添加的相應的功能jar進行自動配置。例如,類路徑中有HSQLDB jar包的情況下,如果沒有主動定義相應的數據源連接bean,則spring boot會自動配置內存數據庫。

自動配置需添加相應的@EnableAutoConfiguration或者@SpringBootApplication來啟用。通常放置其一於主類即可。

自動配置的覆蓋:

自動配置是非侵入性的,可以通過定義相應的自定義配置類進行覆蓋,如果需要知道工程目前使用了那些自動配置,可以通過在啟動時添加—debug選項,來進行輸出。

禁用某些自動配置

如果發現輸出的日中包含一些不需要應用的自動配置可以通過在註解@EnableAutoConfiguration上添加exclude附加選項來禁用,如下:

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
 
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

如果相應的配置類不再類路徑下,則可以使用excludeName屬性進行全路徑配置。

另外,也可以通過配置文件spring.autoconfigure.exclude屬性進行配置。

Spring bean及依賴註入

使用@ComponentScan進行bean的掃描及使用@Autowired進行以來註入。

如果工程結構遵循了以上的建議結構,那麽添加@ComponentScan於主類上,就會將所有的諸如@Component, @Service, @Repository, @Controller等註解的類註冊為spring bean。

如下示例,使用構造器諸如的@Service註解的服務類:

package com.example.service;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class DatabaseAccountService implements AccountService {
 
        private final RiskAssessor riskAssessor;
 
        @Autowired
        public DatabaseAccountService(RiskAssessor riskAssessor) {
                this.riskAssessor = riskAssessor;
        }
 
        // ...
 
}

如果只有一個構造函數,則@Autowired可以省略。

@SpringBootApplication:等價以下三個註解默認配置

  • @EnableAutoConfiguration:自動配置
  • @ComponentScan:自動組件掃描
  • @Configuration:配置類註解
package com.example.myapplication;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
 
        public static void main(String[] args) {
               SpringApplication.run(Application.class, args);
        }
 
}

包含的註解並不是強制性的,可以自定義的使用相應的註解以使用相應的特性:

package com.example.myapplication;
 
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
 
@Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {
 
        public static void main(String[] args) {
                       SpringApplication.run(Application.class, args);
        }
 
}

如上,不使用自動掃描發現,及主動引入基於java的配置類。

運行你的工程

可以將工程打包為一個可運行的jar,並使用內置的http服務器來運行。

$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar

或者添加調試:

$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
       -jar target/myapplication-0.0.1-SNAPSHOT.jar

使用maven插件運行:

$ mvn spring-boot:run

spring boot 使用及最佳實踐