Spring Boot 2.0.0參考手冊_中文版_Part III_14-18

文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書

14. 組織你的代碼

Spring Boot工作時不要求任何特定的代碼布局,但是有一些最佳實踐還是很有幫助的。

14.1 使用“default”包

當一個類沒有包含一個package聲明時,它當做是在default package中。通常情況下不建議使用default package,應該避免使用它。當Spring Boot應用使用@ComponentScan@EntityScan@SpringBootApplication它會引起一些特別的問題,因為Spring Boot會讀取每個jar中的每個類。

我們建議你遵循Java推薦的包命名規范,使用一個反轉的域名(例如,com.example.project)。

14.2 定義主應用類

通常我們建議你將你的主應用類放在其它類之上的根包中。@EnableAutoConfiguration注解經常放在你的主類(main class)中,對于某些像它隱式的定義了一個基search package,例如,如果你正在寫一個JPA應用,@EnableAutoConfiguration注解的類所在的包將被用來搜索@Entity項。

根包的應用也允許使用@ComponentScan注解而不需要指定basePackage特性。如果你的主類是在根包中,你也可以使用@SpringBootApplication注解。

下面是一個典型的布局:

com
 +- example
     +- myproject
         +- Application.java
         |
         +- domain
         |   +- Customer.java
         |   +- CustomerRepository.java
         |
         +- service
         |   +- CustomerService.java
         |
         +- web
             +- CustomerController.java

Application.java文件會聲明main方法和基本的@Configuration

package com.example.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

15. 配置類

Spring Boot支持基于Java的注解。盡管可以通過XML源調用SpringApplication.run()方法,但我們通常建議你主要的源是一個@Configuration類。

網上已經發布了許多使用XML配置來進行Spring配置的例子。但要盡可能的嘗試使用等價的Java注解。搜索enable*注解是一個好的開端。

15.1 導入額外的配置類

你不必將所有的@Configuration放到一個單獨的類中。可以使用@Import注解來導入額外的配置類?;蛘?,你可以使用@ComponentScan來自動獲得所有的Spring組件,包括@Configuration類。

15.2 導入XML配置

如果你絕對的必須使用基于XML的配置,我們推薦你仍然從@Configuration類開始。你可以使用額外的@ImportResource注解來加載XML配置文件。

16. 自動配置

Spring Boot自動配置會基于你添加的jar依賴試圖自動配置你的Spring應用。例如,如果HSQLDB在你的classpath中,并且你沒有手動的配置任何數據庫連接beans,我們將會在自動配置一個內存中的數據庫。

你需要通過添加@EnableAutoConfiguration@SpringBootApplication注解到你的@Configuration類中的一個來選擇性的加入自動配置。

你應該僅添加一個@EnableAutoConfiguration注解。我們通常建議你將它添加到你主要的@Configuration類中。

16.1 逐漸替換自動配置

自動配置是非入侵性的,在任何時候你都可以開始定義你自己的配置來替換自動配置的指定部分。例如,如果你要添加你自己的DataSource bean,默認嵌入的數據庫支持將會退出。

如果你需要找出當前正在應用的自動配置和為什么,你可以用--debug開關來啟動你的應用。這將會使核心日志的輸出級別變為debug級別并輸出一個自動配置報告到控制臺。

16.2 禁用特定的自動配置

如果你發現正在應用特定的你不想使用的自動配置類,你可以使用@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 {
}

如果這個類不在classpath中,你可以使用這個注解的excludeName特性并指定全限定名來代替。最后,你也可以通過spring.autoconfigure.exclude屬性來排除,從而控制自動配置類的列表。

你也可以在注解級別或使用屬性來定義排除項。

17. Spring Beans和依賴注入

你可以自由的使用任何標準的Spring框架技術來定義你的beans和它們注入的依賴。為了簡便,我們經常使用@ComponentScan來發現你的beans,結合@Autowired構造函數注入也工作的很好。

如果你根據上面的建議組織你代碼(將你的應用類放在根包中),你可以添加@ComponentScan注解而不需要任何參數。你所有的應用組件(@Component,@Service,@Repository,@Controller等等)將會作為Spring bean進行自動注冊。

下面是一個@Service Bean的例子,通過使用構造函數注入來獲得RiskAssessor bean。

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;
    }

    // ...

}

注意使用構造函數注入允許riskAssessor字段標記為final,意味著它接下來不能被修改。

18. 使用@SpringBootApplication注解

許多Spring Boot的開發者總是在它們的主類上加上@Configuration,@EnableAutoConfiguration@ComponentScan注解。由于這些注解頻繁的在一起使用(尤其是你遵循上面的最佳實踐時),Spring Boot提供了一個方便的@SpringBootApplication注解來代替它們。

@SpringBootApplication注解等價于使用@Configuration@EnableAutoConfiguration@ComponentScan以及它們的默認特性:

package com.example.myproject;

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);
    }

}

@SpringBootApplication也提供了別名來定制@EnableAutoConfiguration@ComponentScan的特性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容