【Spring Boot基礎配置】
【Spring Boot 基礎配置】
一、不使用spring-boot-starter-parent
spring-boot-starter-parent雖然方便,但是在公司開發微服務專案或者多模組專案時一般需要使用自己公司的parent,這個時候如果還想進行專案依賴版本的統一管理,就需要使用dependencyManagement來實現了。新增如下程式碼到pom.xml檔案中
<dependencyManagement> <dependencies> <denpendency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-denpendencies</artifactId> <version>2.0.4.RELEASE</version> <type>pom</type> <scopo>import</scopo> </denpendency> </dependencies> </dependencyManagement>
此時,就可以不用繼承spring-boot-starter-parent了,但是Java的版本,編碼的格式都需要開發者手動配置。Java版本的配置很簡單,新增一個plugin即可。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
二、@SpringBootApplication
我們知道@Spring BootApplication註解是加在專案啟動類上的。@SpringBootApplication實際上是一個組合註解,定義如下:
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} )
1、@SpringBootConfiguration
本質上就是一個@Configuration。所以其功能就是表明這是一個配置類,開發者可以在這個類中配置Bean。有點類似於Spring中applicaionContext.xml檔案的角色。
2、@EnableAutoConfiguration
表示開啟自動化配置,SpringBoot中的自動化配置是非侵入式的,在任意時刻,開發者都可以使用自定義配置代替自動化配置中的某一個配置。
3、@ComponentScan
完成包的掃描,也是Spring中的功能。由於@ComponentScan註解預設掃描的類都位於當前類所在包的下面,因此建議在實際專案開發中把啟動類放在根包中!!
4、自定義配置Bean
雖然專案的啟動類也包含@Configuration註解,但是開發者可以建立一個新的類專門用來配置Bean,這樣便於配置的管理。這個類只需要加上@Configuration註解即可,程式碼如下:
@Configuration
public class MyConfig{
}
專案啟動類中的@ComponentScan註解,除了掃描@Service、@Repository、@Component、@Controller和@RestController等之外,也會掃描@Configuration註解的類。
三、Tomcat配置
1、常規配置
SpringBoot中,可以配置Tomcat、Jetty、Undertow、Netty等容器。當開發者添加了spring-boot-starter-web依賴之後,預設會使用Tomcat作為Web容器。如果需要對Tomcat做進一步的配置,可以在application.properties中進行配置,程式碼如下:
server.port=8081
server.error.path=/error
server.servlet.session.timeout=30m
server.servlet.context-path=/chapter02
server.tomcat.uri-encoding=utf-8
server.tomcat.threads.max= 500
server.tomcat.basedir=/hom/sang/tmp
- error.path配置類當專案出錯時跳轉去的頁面
- session.timeout配置了session失效時間,如果不寫單位,預設是秒,m是分鐘。
- context-path表示專案名稱,不配置時預設為/,配置了,就要在訪問路徑中加上配置的路徑。
- threads.max表示配置Tomcat最大執行緒數。
- basedir是一個存放Tomcat執行日誌和臨時檔案的目錄,不配置就使用系統的臨時目錄。
2、HTTPS配置
國內有一些雲伺服器廠商提供免費的HTTPS證書,一個賬號可以申請數個。不過在JDK中提供了一個Java數字證書管理工具keytool,在\jdk\bin目錄下,通過這個工具可以自己生成一個數字證書,生成命令如下:
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore sang.p12 -validity 365
命令解釋:
- -genkey表示要建立一個新的金鑰
- -alias表示keystore的別名
- -keyalg表示使用的加密演算法是RSA
- -keysize表示金鑰的長度
- -keystore表示生成的金鑰存放位置
- -validity表示金鑰的有效時間
cmd執行上述命令,根據提示輸入即可。在當前目錄下生成sang.p12的檔案,將這個檔案複製到專案的根目錄下,然後在application.properties中做如下配置:
server.ssl.key-store=sang.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=123456
程式碼解釋:
- key-store-password就是在cmd命令執行過程中輸入的密碼
若以http訪問:
這是因為SpringBoot不支援同時在配置中啟動HTTP和HTTPS。這個時候可以配置請求重定向,將HTTP請求重定向為HTTPS請求。配置方式如下:
編寫自定義配置類
package com.darkerg.helloworld.config;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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("/*");
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(8080);
connector.setSecure(false);
connector.setRedirectPort(8081);
return connector;
}
}
這裡首先配置一個TomcatServletWebServerFactory,然後新增一個Tomcat中的Connector(監聽8080埠),並將請求轉發到8081上去。
配置完成之後,在瀏覽器中輸入 “http://localhost:8080/chapter02/hello”,就會自動重定向到http://localhost:8081/chapter02/hello上面去。
3、Jetty配置和Undertow配置
4、Properties配置
SpringBoot專案中的application.properties配置檔案可以出現在下面4個位置:
- 專案根目錄下的config資料夾中
- 專案根目錄下
- classpath下的config資料夾中(resources)
- classpath下
並且這也是載入的優先順序,SpringBoot將按照這個優先順序查詢配置資訊,並載入到Spring Environment中。
5、型別安全配置屬性
Spring提供了@Value註解以及EnvironmentAware介面來將Spring Environment中的資料注入到屬性上,SpringBoot對此進一步提出了型別安全配置屬性(Type-safe-ConfigurationProperties),這樣即時在資料量非常龐大的情況下,也可以更加方便地將配置檔案中的資料注入Bean中。考慮在application.properties中新增如下配置:
book.name=三國演義
book.author=羅貫中
book.price=30
將這一段配置注入如下Bean中:
@Component
@ConfigurationProperties(prefix = "book")
public class Book {
private String name;
private String author;
private Float price;
//省略getter/setter
}
程式碼解釋:
- @ConfigurationProperties中的prefix屬性描述了要載入的配置檔案的字首
- 如果配置檔案是一個YAML檔案。那麼可以將資料注入到一個集合中。
- Spring Boot採用了一種寬鬆的規則來進行屬性繫結,如果Bean中的屬性名為authorName,那麼配置檔案中的屬性可以是book.author_name、book.author-name、book.authorName或者book.AUTHORNAME。
修改編碼
最後建立BookController進行簡單測試
@RestController
public class BookController {
@Autowired
Book book;
@GetMapping("/book")
public String book(){
return book.toString();
}
}
6、YAML配置
①常規配置
YAML是JSON的超集,簡潔而強大,是一種專門書寫配置檔案的語言,可以替代application.properties。在建立一個SpringBoot專案時,引入的spring-boot-starter-web依賴間接地引入了snakeyaml依賴,snakeyaml會實現對YAML配置的解析。YAML的使用非常簡單,利用縮排來表示層級關係,並且大小寫敏感。在SpringBoot專案中使用YAML只需要在resources目錄下建立一個application.yml檔案即可,然後向application.yml中新增如下配置:
server:
port: 80
servlet:
context-path: /chapter02
tomcat:
uri-encoding: utf-8
此時可以將resources目錄下的application.properties檔案刪除,完全使用YAML完成檔案的配置。
②複雜配置
YAML不僅可以配置常規屬性,也可以配置複雜屬性,例如下面一組配置:
my:
name: 北京
address: China
如上面,這樣也可以注入到一個Bean中。
YAML還支援列表的配置,例如下面的一組配置:
my:
name: 北京
address: China
favorites:
- 足球
- 徒步
- Coding
注入到Bean中,需要新增
private List<String> favorites;
更復雜的配置,即集合中也可以是一個物件,如下:
my:
users:
- name: darkerg
address: China
favorites:
- 足球
- 徒步
- Coding
- name: darkerg2
address: China
favorites:
- 閱讀
- 吉他
注入:
User.java
import lombok.Data;
import java.util.List;
@Data
public class User {
private String name;
private String address;
private List<String> favorites;
}
Users.java
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Data
@ConfigurationProperties(prefix = "my")
public class Users {
private List<User> Users;
}
YAML雖然方便,但是YAML也有一些缺陷,例如無法使用@PropertySource註解載入YAML檔案。
7、Profile
開發者在專案釋出之前,一般需要頻繁地在開發環境、測試環境以及生產環境之間進行切換,這個時候大量的配置需要頻繁更改,例如資料庫配置、redis配置、mongodb配置、jms配置等。頻繁修改帶來了巨大的工作量,Spring對此提供瞭解決方案(@Profile註解),SpringBoot則更進一步提供了更加簡潔的解決方案,SpringBoot中約定的不同環境下配置檔名稱規則為application-{profile}.properties,profile佔位符表示當前環境的名稱,具體配置步驟如下:
①建立配置檔案
首先在resources目錄下建立兩個配置檔案:application-dev.properties 和 application-prod.properties,分別表示開發環境中的配置和生產環境中的配置。
其中,application-dev.properties檔案的內容:
server.port=8080
application-prod.properties檔案的內容如下:
server.port=80
②配置application.properties
然後在application.properties中進行配置
spring.profiles.active=dev
③在程式碼中配置
在啟動類的main方法上新增如下程式碼,可以代替第二步。
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
SpringApplicationBuilder builder = new SpringApplicationBuilder(HelloworldApplication.class);
builder.application().setAdditionalProfiles("prod");
SpringApplication.run(HelloworldApplication.class, args);
}
}
④專案啟動時候配置
也可以將專案打包成jar包啟動時候,命令列:
java -jar xxx.jar --spring.profiles.active=prod