本節主要描述SB里面的常見配置
[TOC]
不使用推薦配置
通常在公司,團隊協作的時候,需要使用公司統一的依賴包,比如我們在開發微服務,以及多模塊項目的時候,就直接面對了這個問題。
這個時候就不需要使用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個問題
- Banner對象需要手工導入包,無提示導入
import org.springframework.boot.Banner;
- 可能是我手工banner包導錯了,導致出現啟動過后有報錯日志。
- 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是一個安全通訊協議,它需要安全證書支持。
一般國際認證的證書,都要錢。阿里云免費提供了證書申請,這是一個很好的事情。
我們這里也可以通過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個地方,分別是:
- ./config/
- ./src/
- ./src/main/resources/config/
- ./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.properties
,application-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
,就是開發模式。