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 容器加载之后执行,执行完成后项目启动完成。
- 定义初始化类 CommandLineRunnerTest
- 实现 CommandLineRunner 接口,并实现它的 run() 方法,在该方法中编写初始化逻辑
- 注册成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 容器加载之后执行,执行完成后项目启动完成。
- 定义初始化类 ApplicationRunnerTest
- 实现 ApplicationRunner 接口,并实现它的 run() 方法,在该方法中编写初始化逻辑
- 注册成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.youkuaiyun.com/Roobert_Chao/article/details/89485514
- application.properties 配置文件添加:
# 上传文件总的最大值
spring.servlet.multipart.max-request-size=10MB 限制单个文件的最大值
# 单个文件的最大值
spring.servlet.multipart.max-file-size=10MB 限制上传的多个文件的总大小
- 配置 上传文件的操作 Bean 。

三、Spring Boot 打包部署。
我们了解的三种打包方式:pom、jar、war。
- pom 包:用在父级工程或聚合工程中。
用来做jar包的版本控制。- war 包:将会打包成war,部署到外部服务器(Tomcat)。如网站或服务。
- jar 包:将会打包成 jar 文件,用作jar包使用,支持前后端分离。
非 Spring Boot 项目的打包方式:https://blog.youkuaiyun.com/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
- pom.xml 中声明主类。

- 点击 【Maven】插件中的 【install】或者是【package】。
- 或者
使用如下方式。


module 选择需要打包的项目名。Main Class 选择项目的主程序类。输出目录确保是空的,MANIFEST.MF 文件只有一个。保存设置。



最后的输出 Jar 文件在 out(橙色,编译后的文件夹) 文件夹下边。运行 java -jar xxxx.jar即可运行项目。
2、War 包。
- 使用外部的服务器,默认的启动类要继承SpringBootServletInitiailzer类,并复写configure()方法。
- SpringBootServletInitializer 的执行过程,就是通过SpringApplicationBuilder 构建并封装SpringApplication对象,并最终调用 SpringApplication 的 run 方法的过程。
- SpringBootServletInitializer就是原有的web.xml文件的替代。
2.1、使用外置的 服务器(Tomcat )
- 确认 pom.xml 中的打包方式,配置 SpringBoot 打包插件。

- 移除 tomcat 或者依赖 tomcat 修改为 Scope 修改为 provide 。
- 移除 tomcat 。

- 修改 tomcat 的作用范围。

- 继承 SpringBootServletInitializer 实现 configure ,并实现主类方法。
方式一:启动类继承SpringBootServletInitializer实现configure:

方式二:新增加一个类 继承 SpringBootServletInitializer 实现configure。

- 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 进行打包 。
- 注意 pom.xml 文件中的打包方式,确定后点击 package。
Maven 命令详情查看文章:https://blog.youkuaiyun.com/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);
}
}

本文详细介绍了SpringBoot中资源初始化的方法,包括实现CommandLineRunner和ApplicationRunner接口,使用@Order注解控制初始化顺序,以及@PostConstruct注解的使用。同时,深入探讨了SpringBoot的文件上传配置和三种打包方式:pom、jar、war,对比了Jar包与War包在启动过程中的区别。

1万+

被折叠的 条评论
为什么被折叠?



