spring-boot 操作手冊
1、spring-boot配置文件
spring-boot會按順序讀取以下目錄的application.properties
1、項目根目錄的config目錄
2、項目根目錄
3、項目classpath下的config目錄
4、項目classpath根目錄
2、指定配置文件位置
如果想自己指定配置文件,可以在spring容器的啓動命令中加入參數
new SpringApplicationBuilder(Application.class).properties("spring.config.location=classpath:/test-folder/my-config.properties").run(args);
3、yml文件
注意:使用yml配置文件的縮進要使用空格,不要使用tab鍵進行縮進。
4、允許時指定profiles配置
定義多個不同的profiles,yml的profiles可以用---(只適合yml配置文件)進行分割,properties配置文件需要編寫多份區分,(-dev.properties、-test.properties等)在spring容器啓動時,使用spring.profiles.active來指定激活那個profiles。
5、Profiles實現多環境下配置切換
創建application-{profile}.properties文件 存放不同環境特有的配置,將於環境無關的屬性放置到application.properties文件裏面,
並在application.properties文件中通過spring.profiles.active=xxx 指定加載不同環境的配置。
如果不指定,則默認加載application.properties的配置,不會加載帶有profile的配置。
server.port=8081
#配置項目啓動的時候,決定使用哪個環境,開發(dev)、測試(test)還是產品(prod)環境
spring.profiles.active=dev
創建配置文件:application-dev.properties application-test.properties application-prod.properties
6、熱部署
不用每次修改java文件後,都需要重寫允許main方法才能生效。
添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
坑:我在實際開發中配置之後沒有效果,原因是idea默認是沒有自動編譯的,我們這裏需要添加修改配置
1、File-Settings-Compiler-> Build Project automatically 打勾
2、mac:shift+alt+command+/ 選擇Registry,勾上 Compiler autoMake allow when app running
windows:ctrl + shift + alt + /
7、自定義 Filter
見 com.hyperchain.filter.WebConfiguration 中的代碼
8、將SpringBoot配置文件中數據加載到實體類中
@Configuration
@PropertySource(value=”classpath:application.yml”)
指明瞭配置文件所處的位置,classpath 下的 application.yml。
@ConfigurationProperties(prefix=”com.springboot”)
注:實體類對應的屬性名要與配置文件中的屬性保持一致,並且要加上 setter 和 getter 方法。
這樣在項目啓動的時候,SpringBoot 就會去加載對應配置文件中的屬性,反射創建一個 bean 對象,
並放入 Spring 的容器(ConcurrentHashMap)中,在需要使用的地方用 @Autowired 屬性注入。
9、springBoot日誌
只要在application.properties 中加入logging.level.xxxx=DEBUG就可以了。其中xxxx是你想監聽的包路徑,logging.level 後面可以根據包路徑配置不同資源的 log 級別
logging.path=/Users/lixuanfeng/Desktop/workspace/spring_boot/logs
logging.level.org.springframework.web=INFO
參考博客:https://blog.csdn.net/weixin_41660188/article/details/80113837
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
10、關閉特定的自動配置
我在pom.xml中添加了有關spring-boot-starter-data-jpa依賴,Spring Boot會自動進行JPA相關的配置,如果配置文件中沒有相關的配置啓動會報錯
則可以在spring的啓動類的@SpringBootApplication註解上添加exclude參數。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
11、自定義Banner
在 src/main/resources 下新建一個banner.txt
通過網站:http://patorjk.com/software/taag 網站生成字符,將生成的字符複製到banner.txt中
關閉banner
關閉banner第一種方法
SpringApplication application = new SpringApplication(Ch522Application.class);
application.setBannerMode(Banner.Mode.OFF);//關閉banner
application.run(args);
關閉banner第二種方法
new SpringApplicationBuilder(Ch522Application.class).bannerMode(Banner.Mode.OFF).run(args);
關閉banner第三種方法在application.properties 文件中配置如下
spring.main.banner-mode = off
12、通過jar啓動時候指定參數
java -jar xx.jar --server.port=9090
13、基於Docker的部署
1、把項目打成jar包傳到安裝了docker的服務器上。
2、編寫Dockerfile文件,與jar包放在同級目錄。
FROM java:8
MAINTAINER LXF
ADD spring_boot-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
3、編譯鏡像
docker build -t wisely/ch10docker .
如果報錯:docker報錯Get https://registry-1.docker.io/v2/: x509: certificate has expired or is not yet valid
同步時間即可:
yum install -y ntp
ntpdate cn.pool.ntp.org
推薦幾個時間服務器:
time.nist.gov
time.nuri.net
asia.pool.ntp.org
asia.pool.ntp.org
asia.pool.ntp.org
asia.pool.ntp.org
4、查看本地鏡像
docker images
5、運行鏡像
docker run -d -name ch10 -p 8080:8080 wisely/ch10docker
14、springBoot jar包部署
1、cd 項目跟目錄(和pom.xml同級)
mvn clean package
## 或者執行下面的命令
## 排除測試代碼後進行打包
mvn clean package -Dmaven.test.skip=true
2、打包完成後 jar 包會生成到 target 目錄下,命名一般是 項目名+版本號.jar
java -jar target/spring-boot-scheduler-1.0.0.jar 這種方式,只要控制檯關閉,服務就不能訪問了
nohup java -jar target/spring-boot-scheduler-1.0.0.jar &
java -jar app.jar --spring.profiles.active=dev 啓動時選取不同的配置文件
java -Xms10m -Xmx80m -jar app.jar & 設置jvm參數
15、springBoot war包部署
1、maven 項目,修改 pom 包
<packaging>war</packaging>
2、打包時排除tomcat
dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
3、註冊啓動類
創建 ServletInitializer.java,繼承 SpringBootServletInitializer ,覆蓋 configure(),把啓動類 Application 註冊進去。
外部 Web 應用服務器構建 Web Application Context 的時候,會把啓動類添加進去。
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
4、打包
mvn clean package -Dmaven.test.skip=true
5、放到tomcat的webapp中運行即可。
16、查看JVM參數值
jinfo -flags pid(進程號)
-XX:CICompilerCount=2 最大的並行編譯數
-XX:InitialHeapSize=16777216 指定 JVM 的最大堆內存大小
-XX:MaxHeapSize=257949696 指定 JVM 的初始堆內存大小
-XX:MaxNewSize=85983232
-XX:MinHeapDeltaBytes=196608
-XX:NewSize=5570560
-XX:OldSize=11206656
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps
17、通過./xxx.jar啓動項目
1、maven,需要包含以下的配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
2、打包 mvn clean package -Dmaven.skip.test=true
3、可以直接./yourapp.jar 來啓動
4、註冊爲服務,做一個軟鏈接指向你的jar包並加入到init.d中,然後用命令來啓動。
ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
chmod +x /etc/init.d/yourapp
5、stop或者是restart命令去管理你的應用。
/etc/init.d/yourapp start|stop|restart
或者:service yourapp start|stop|restart
18、springBoot啓動完成之後初始化資源
1、直接創建一個類繼承 CommandLineRunner ,並實現它的 run() 方法。
2、在類中加上註解
@Component
@Order(1) 確保初始化的順序,越小越先執行。
19、springBoot定時任務
1、在啓動類上加上@EnableScheduling註解。
2、編寫定時任務類,在類上加上@Component註解,在方法上加上定時計劃 @Scheduled(cron="*/6 * * * * ?")
20、favicon(圖標)配置
1、在配置文件中設置,默認爲true
spring.mvc.favicon.enabled=true
2、
21、springBoot集成jwt,實現token驗證
1、參考資料:https://www.jianshu.com/p/e88d3f8151db
22、springBoot全局異常處理
1、創建全局異常處理類:GlobalException 在類上加上註解 @RestControllerAdvice
2、創建具體的需要捕獲的異常方法:handleBusinessException(BusinessException be) ,在方法上加入註解。
@ResponseBody
@ExceptionHandler(BusinessException.class)
public BaseResponse handleBusinessException(BusinessException be) {
logger.warn(be.getMsg());
BaseResponse fail = BaseResponse.fail(be.getErrorCode(), be.getMsg());
return fail;
}
未完待續。。。
遇到的坑
1、不能自動建數據庫表排查原因我在啓動類上加了: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
2、全局異常處理序列化問題:com.fasterxml.jackson.databind.exc.InvalidDefinitionException , 在BaseResponse 中放入Object對象會出現這個問題。