02-Spring Boot的基礎配置

本節主要描述SB里面的常見配置

[TOC]


目錄.jpg

不使用推薦配置

通常在公司,團隊協作的時候,需要使用公司統一的依賴包,比如我們在開發微服務,以及多模塊項目的時候,就直接面對了這個問題。

這個時候就不需要使用parent了,需要在maven中的引用自己的dependencyManagement。

這樣可以解決問題,但是很多東西就需要手工配置了,比如java版本號、編碼格式都需要在pom中自定義實現。

查看springboot構建版本默認的配置,如下

再次解釋下@Spring BootApplication

這個是在啟動類上的注解,他是一個組合注解,包含三個點

  • 表明是配置類
  • 表明是自動配置類
  • 表明是掃描器:掃描當前類所在包的下級目錄。

通常,掃描器掃描是依靠在被掃描對象上的注解進行識別的,被掃描對象注解如下:

  • @Service
  • @Repository
  • @Component
  • @Controller
  • @RestController
  • @ComponentScan
  • @Configuration
  • ……

定制的Banner

什么是Banner,就是SpringBoot服務啟動的時候,看到的LOGO。

有的時候想自定義一些好看的標號,思路是,利用TXT轉藝術字體,然后在rescourses文件夾下建立banner.txt文件,把藝術字體復制進去。

藝術字體轉換網站:

導入banner.txt過后,這個文件可能被IDE識別報錯,最簡單的處理方法是找到Promblem欄,手工把bug刪除。

程序員寫代碼,在某種程度上是一種玄學。一般都要請出佛祖來幫忙,推薦Banner如下:

////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//             佛祖保佑          永無BUG         永不修改         //
////////////////////////////////////////////////////////////////////

當然,你也可以關閉這個Banner,具體做法是在啟動類中,利用SpringApplicationBuilder類進行操作,如下:

public static void app(String[] args){
    SpringApplicationBuilder builder = new SpringAPplicationBUilder(Chapter012APplication.class);
    builder.bannerMode(Banner.Mode.OFF).run(args);
}

筆者在操作關閉Banner的時候出現2個問題

  1. Banner對象需要手工導入包,無提示導入 import org.springframework.boot.Banner;
  2. 可能是我手工banner包導錯了,導致出現啟動過后有報錯日志。
  3. Banner關閉不生效

——這些都無所謂,我是需要佛祖庇護的。所以根本就不會有關閉banner的事出現。

Web容器配置

默認的web容器,使用的是tomcat,如果你不喜歡,可以安裝其他幾個容器,比如jetty,以及redhat的Undertow。

Tomcat容器配置

pom中使用spring-boot-starter-web后,默認容器是tomcat。

至于它的配置,都在application.properties中,以server.xxxx開頭的項。

這里要提的是,在這里配置session的過期時間:默認是以秒為單位,但有個很有意思的規則,他會按分鐘進行舍計算,比如輸入了119,默認單位是秒,session生效時間就60秒=1分鐘,舍去了不足一分鐘的秒時間。

如果直接指定單位為分鐘的話,請帶單位m

HTTPS配置

不熟悉HTTPS的同學,可以先了解下,百度百科專業指導

HTTPS是一個安全通訊協議,它需要安全證書支持。

一般國際認證的證書,都要錢。阿里云免費提供了證書申請,這是一個很好的事情。

我們這里也可以通過JDK生成一個證書,只不過這個證書不被“瀏覽器”承認罷了。

使用JDK生成數字證書管理工具:

進入\jdk\bin目錄,利用java數字證書管理工具keytool生成證書,需要通過命令行啟用:

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore sang.p12 -validity 365
  • genkey:創建一個新的密鑰
  • alias:表示keystore的別名
  • keyalg:加密算法使用什么
  • keysize:密鑰的長度
  • keystore:密鑰的存放位置
  • validity:密鑰的有效時間,單位為天

在執行的過程中,需要輸入密碼,根據提示操作即可。

我們把生成的sang.p12放在項目根目錄,然后去application.properties中進行如下配置

server.ssl.key-store=sang.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=123456

這里需要說一些最后一個參數server.ssl.key-store-password,這個是在生成證書的時候,命令行中要求輸入的密碼。

密碼在這里是明文誒~~~~,properties加密,利用jasypt,請見

啟動server,可以進行https驗證了。

由于我們用的是自己頒發的證書,瀏覽器會提示這個證書它信任不過,然后吧啦一堆什么信息竊取風險。——呵呵。

SpringBoot中是不支持HTTP和HTTPS同時存在的,所以就有利用重定向技術將http重定向到https中去。

重定向HTTP請求到HTTPS

思路就是監聽所有接口,重定向到https。

  • 寫個TomcatConfig類來控制重定向
@Configuration
public class TomcatConfig{
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory(){
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context){
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(createTomcatConnector());
        return factory;
    }
    private Connector createTomcatConnector(){
        Connector connector = new Connector("org.apache.coyote.http11,Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80);  // 監聽端口80(默認不輸端口,則為80端口)
        connector.setSecure(false);
        connector.setRedirectPort(8081); // 8081是我們配置的http server安全端口
        return connector;
    }
}
  • Spring的@Bean注解用于告訴方法,產生一個Bean對象,然后這個Bean對象交給Spring管理。產生這個Bean對象的方法Spring只會調用一次,隨后這個Spring將會將這個Bean對象放在自己的IOC容器中。請見這篇博文的解釋
  • 如果要監聽多個端口,請見
  • 這段代碼要放在啟動類同級或者子目錄下才能生效
  • @Configuration相當于一個配置文件。這里就是一個tomcat的重定向配置文件

Context包的導入項挺多,請用import org.apache.catalina.Context;

Jetty配置

Jetty的配置,也在pom.xml中進行maven配置:

  • 先在pom中先除去tomcat,使用exclusions標簽,在spring-boot-starter-web中去掉tomcat。
  • 引入jetty的依賴
……
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
     <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
……

Undertow配置

Undertow是RedHat的開元java服務器,有非常好的性能。其配置方式根Jetty一樣。關鍵artifactId為:

spring-boot-starter-undertow

Properties配置

SpringBoot采用了大量自動化配置,對于開發者而言,在實際項目中不可避免會有一些需要自己手動配置的地方。這些自定義的文件,都在resources目錄下的application.properties文件中。

四個properties文件以及他們的讀取規則

在SB項目中,application.properties文件會出現在4個地方,分別是:

  1. ./config/
  2. ./src/
  3. ./src/main/resources/config/
  4. ./src/main/resources/

這四個地方,配置文件的讀取優先級如排序(出現沖突的時候,優先使用優先級高的properties屬性),在書寫的時候,還請多多注意。

一般系統里面會生成第四種properties,對于使用場景,目前一個properties應該就足夠了,如果有其他場景需求,請讀者也請告知我,謝謝。

類型安全配置屬性

無論Properties配置,還是YAML配置,最終都會被家在到Spring Environment中。

Spring提供了@Value注解等方式將Environment中的數據注入到屬性上,Spring提供了非常安全的機制,就算是大數據的情況下也可以方便的把配置文件中的輸入注入到Bean中。

我們在application.properties中寫一段配置

book.name=西游記
book.author=吳承恩
book.price=12

現在把這段數據注入到如下Bean中:

@Component
@ConfigurationProperties(prefix="book") // book對應properties中的名字
public class Book{
    private String name;
    private String author;
    private Float price;
    
    // ……getter()/setter()
    
}

這個Book類的bean,寫在那里——想寫哪兒寫哪兒(啟動類的子目錄中),別忘了注釋即可。

一般這個功能在哪個場景使用?——config中最多了。

在Controller中,我們可以通過@Autowired標簽,直接使用

@RestCOntroller
public class BookCOntroller{
    @Autowired
    Book book; // 通過注解直接使用
    @GetMappint("/book")
    public String book(){
        return book.toString();
    }
}

YAML配置

YAML是JSON的超集,專門為寫properties而生,它的目標是替代properties。

而且現在已經有很多公司都用YAML替代了properties。

YAML的特點是:

  • 簡潔

它就一個特點,相對于properties,它在復雜配置的時候,比如寫復雜的Bean注入的時候(比如寫一個列表),簡直比properties好太多了。YAML文件與properties文件比較

YAML的依賴

YAML需求snakeyaml依賴,在我們建立第一個項目,引入spring-boot-starter-web的時候,已經將snakeyaml添加進去了。

YAML的問題

YAML目前的缺點是:無法使用@PropertySource注解加載YAML文件。大家使用的時候,注意一下。如果接受不了,properties也是好的選擇。

@PropertySource 這個注解是方便引入properties,請見

學習YAML

替代配置文件,看這篇就夠了:YAML快速入門-簡書

環境切換-Profile

開發都分開發環境和生產環境,兩者之間的配置要求肯定是不一樣的。

每次發布的時候都需要進行配置轉換,實在太麻煩,現在有了Profile,萬事都好說了。

Profile是為了解決環境切換配置要改,導致要動代碼問題的。有了它,用命令行就能切換。

創建配置文件

在resouces目錄下創建2個文件:application-dev.propertiesapplication-prod.properties,在里面寫清楚需要環境切換時候的配置:

比如,

server.port=80 // 生產環境properties文件書寫

server.port=8080 // 開發環境properties文件書寫

配置application.properties

在文件中,寫上spring.profiles.active=dev

這表明默認為開發環境。

在代碼中配置

如果不想在properties中配置,可以在代碼中配置,這里不推薦,也不細說了。大家有興趣可以自行搜索。

項目啟動時配置

java -jar project-01-3-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

啟動的時候,如果沒有--spring.profiles.active=prod,就是開發模式。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容