SpringBoot 初始化資源、文件上傳、打包部署

一、Spring Boot 初始化資源(Initialize resources)

在項目啓動的時候需要做一些初始化的操作,比如初始化線程池,提前加載好加密證書等。

  • SpringBoot 測試初始化資源加載的入口。
@SpringBootApplication
public class ResourcesInitApplication {
	public static void main(String[] args) {
		System.out.println("The ResourcesInitApplication to start.");
		SpringApplication.run(ResourcesInitApplication.class, args);
		System.out.println("The ResourcesInitApplication has started.");
	}
}

1、實現 CommandLineRunner 接口

CommandLineRunner 中的方法會在 Spring Boot 容器加載之後執行,執行完成後項目啓動完成。

  1. 定義初始化類 CommandLineRunnerTest
  2. 實現 CommandLineRunner 接口,並實現它的 run() 方法,在該方法中編寫初始化邏輯
  3. 註冊成Bean(添加 @Component 註解)。
## 真正實現初始化資源加載的位置
@Component
public class CommandLineRunnerTest implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("The CommandLineRunnerTest start to initialize ...");
    }
}

2、實現 ApplicationRunner 接口。

ApplicationRunner 中的方法會在 Spring Boot 容器加載之後執行,執行完成後項目啓動完成。

  1. 定義初始化類 ApplicationRunnerTest
  2. 實現 ApplicationRunner 接口,並實現它的 run() 方法,在該方法中編寫初始化邏輯
  3. 註冊成Bean(添加 @Component註解)
@Component
public class ApplicationRunnerTest implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("The CommandRunner start to initialize ...");
    }
}

CommandLineRunner 接口 與 ApplicationRunner 接口

  • 兩者初始化資源的效果相同。
  • 兩者的區別是 run() 方法中自帶的形參不相同,在 CommandLineRunner 中只是簡單的String… args 變長形參,而 ApplicationRunner 則是包含了 ApplicationArguments 對象,可以幫助獲得更豐富的項目信息。
    在這裏插入圖片描述

3、@order 對上述兩種初始化資源方法規定順序。

  • 添加 @Order 註解的實現類最先執行。
  • 並且 @Order() 裏面的值越小越先執行。

4、@PostConstruct 註解在方法上

使用 @PostConstruct 註解同樣可以幫助我們完成資源的初始化操作,前提是這些初始化操作不需要依賴於其它 Spring Beans 的初始化工作。
由於不必等待 SpringBoot 容器的初始化完成,所以使用 @PostConstruct 註解進行初始化操作的順序是最快的。

@PostConstruct
public void postConstructTest() {
	System.out.println("... PostConstruct 資源初始化方法註解 …");
}

二、Spring Boot 文件上傳。

SpringMVC 的文件上傳以及文件下載:https://blog.csdn.net/Roobert_Chao/article/details/89485514

  1. application.properties 配置文件添加:
# 上傳文件總的最大值
spring.servlet.multipart.max-request-size=10MB		限制單個文件的最大值
# 單個文件的最大值
spring.servlet.multipart.max-file-size=10MB		限制上傳的多個文件的總大小
  1. 配置 上傳文件的操作 Bean 。
    在這裏插入圖片描述

三、Spring Boot 打包部署。

我們瞭解的三種打包方式:pom、jar、war。

  1. pom 包:用在父級工程或聚合工程中。用來做jar包的版本控制
  2. war 包:將會打包成war,部署到外部服務器(Tomcat)。如網站或服務。
  3. jar 包:將會打包成 jar 文件,用作jar包使用,支持前後端分離。

非 Spring Boot 項目的打包方式:https://blog.csdn.net/Roobert_Chao/article/details/90755168

1、Jar 包。

爲了防止出現打包成功,但打出來 jar文件 不包含依賴,且是不能直接運行的情況。
需要查看 maven-compiler-plugin 插件文檔:
https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/maven-plugin/usage.html

  1. pom.xml 中聲明主類。
    在這裏插入圖片描述
  2. 點擊 【Maven】插件中的 【install】或者是【package】。
  3. 或者使用如下方式。
    在這裏插入圖片描述在這裏插入圖片描述
    module 選擇需要打包的項目名。Main Class 選擇項目的主程序類。輸出目錄確保是空的,MANIFEST.MF 文件只有一個。保存設置。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
最後的輸出 Jar 文件在 out(橙色,編譯後的文件夾) 文件夾下邊。運行 java -jar xxxx.jar即可運行項目。

2、War 包。

  • 使用外部的服務器,默認的啓動類要繼承SpringBootServletInitiailzer類,並複寫configure()方法。
  1. SpringBootServletInitializer 的執行過程,就是通過SpringApplicationBuilder 構建並封裝SpringApplication對象,並最終調用 SpringApplication 的 run 方法的過程。
  2. SpringBootServletInitializer就是原有的web.xml文件的替代。

2.1、使用外置的 服務器(Tomcat )

  1. 確認 pom.xml 中的打包方式,配置 SpringBoot 打包插件。
    在這裏插入圖片描述
  2. 移除 tomcat 或者依賴 tomcat 修改爲 Scope 修改爲 provide 。
  • 移除 tomcat 。
    在這裏插入圖片描述
  • 修改 tomcat 的作用範圍。
    在這裏插入圖片描述
  1. 繼承 SpringBootServletInitializer 實現 configure ,並實現主類方法。
    方式一:啓動類繼承SpringBootServletInitializer實現configure:
    在這裏插入圖片描述
    方式二:新增加一個類 繼承 SpringBootServletInitializer 實現configure。
    在這裏插入圖片描述
  2. build 構建 或者使用 【運行命令 mvn package,在 target 目錄下生成war包】。
    在這裏插入圖片描述

server 配置文件失效。

使用外部Tomcat部署訪問的時候,application.properties(或者application.yml)中配置的

server.port=
server.servlet.context-path=

將失效,將使用 tomcat 的端口,訪問 webapps下項目名進行訪問。
爲了防止應用上下文所導致的項目訪問資源加載不到的問題,建議pom.xml文件中<build></build>標籤下添加<\finalName><\/finalName>標籤。如下:
在這裏插入圖片描述

3、使用 Maven 進行打包 。

  1. 注意 pom.xml 文件中的打包方式,確定後點擊 package。
    Maven 命令詳情查看文章:https://blog.csdn.net/Roobert_Chao/article/details/91129512#Maven__85
    在這裏插入圖片描述

Jar 包與War 包啓動區別

  • Jar包:執行 SpringBootApplication 的 run 方法,啓動 IOC 容器,然後創建嵌入式Servlet 容器。
  • War包:先是啓動Servlet服務器,服務器啓動Springboot應用(springBootServletInitizer),然後啓動 IOC容器。
    SpringBootServletInitializer 實例執行 onStartup 方法的時候會通過 createRootApplicationContext方法來執行 run 方法,接下來的過程就同以 Jar包 形式啓動的應用的 run 過程一樣了,在內部會創建IOC容器並返回,只是以war包形式的應用在創建IOC容器過程中,不再創建Servlet容器了。
  • SpringBootServletInitializer 可以使用外部的 Servlet 容器。
1. 必須創建 war 項目,需要創建好web項目的目錄。
2. 嵌入式 Tomcat 依賴 scope指定provided。
3. 編寫 SpringBootServletInitializer 類的子類,並重寫 configure 方法。

public class ServletInitializer extends SpringBootServletInitializer { 
    @Override  
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {  
        return application.sources(FormyselfApplication.class);  
    }  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章