本文已参与「新人创作礼」活动,一起开启掘金创作之路 SpringBoot项目快速搭建 注意:学习阶段禁止使用
SpringBoot建议使用官方提供的工具来快速构建项目,网站:start.spring.io/ ,IDEA自带该功能,但需要联网使用, 也可以使用 start.springboot.io/
注意:官方提供的构建工具默认只能选择固定的版本,有些版本之间的差异非常大,所以如果需要选择某个版本可以自行在pom.xml文件中修改版本
springBoot标准项目结构
resources:资源文件,存放静态文件,模板文件,配置文件
static:存放静态文件
templates:存放模板文件
application.properties:springboot配置文件
springboot项目打包部署
springboot默认将项目打包成jar,然后独立运行
1:加载maven插件
<!-- pom.xml中添加插件 -->
<build>
<plugins>
<!-- SpringBoot打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2:maven命令打包
打包成功之后,在项目的target包可以找到独立运行的jar
3:进入target源目录,运行jar
打开cmd命令框, 运行: java -jar xxx.jar
一个注意点:如果想修改项目端口, 可以: java -jar xxx.jar --server.post=8888
SpringBoot优缺点
优点:
创建独立运行的Spring应用程序
嵌入的Tomcat,无需部署war文件
简化Maven配置
自动配置Spring
提供生产就绪型功能,如:日志,健康检查和外部配置等
不要求配置 XML
非常容易和第三方框架集成起来
缺点:
版本更新较快,可能出现较大变化
因为约定大于配置,所以经常会出现一些很难解决的问题
修改banner
SpringBoot提供了一些扩展点,比如修改banner: 在resources根目录中存入banner.txt文件,替换默认的banner
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
#application.properties
spring.main.banner-mode=off #关闭banner
热部署插件
除了使用JRebel来实现热部署,还可以使用Springboot提供的spring-boot-devtools包来完成Springboot应用热部署
<!-- SpringBoot热部署插件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
SpringBoot重启是reload重启,通过监控classpath的变化,如果classpath中的文件发生变化,即触发重启.springboot通过两个classpath来完成reload,一个basic classloader中加载不变的类(jar包中的类),一个restart classloader中加载classpath中的类(自己写的类),重启的时候,restart classloader中的类丢弃并重新加载
#默认排除的资源
spring.devtools.restart.exclude=static/**,templates/**,public/**
#增加额外的排除资源
spring.devtools.restart.additional-exclude=public/** #处理默认配置排除之外的
spring.devtools.restart.enabled=false #禁用自动重启
切换运行环境
在实际开发中,一个系统是有多套运行环境的,如开发时有开发的环境,测试时有测试的环境,不同的环境中,系统的参数设置是不同的,如:连接开发数据和测试数据库的URL绝对是不同的,那么怎么快速的切换系统运行的环境
我们需要为不同的环境创建不同的配置文件,
application-dev.properties
server.port=8081
application-test.properties
server.port=8082
在application.properties中指定需要使用的环境即可
#指定使用的环境是dev
spring.profiles.active=dev
SpringBoot参数配置
参数来源
主要流程摘要: 1,命令行参数; 如: java -jar xxx.jar --server.port=80 2,ServletConfig和ServletContext; 3,操作系统环境变量; 4,application-{profile}.properties或者YAML文件; 5,application.properties或者YAML文件;
一般用的比较多的就是直接在application.properties或者YAML配置 , 其次是命令行启动方式
application.properties语法
server.port=80
server.session-timeout=30
server.tomcat.uri-encoding=UTF-8
spring.datasource.url = jdbc:mysql://localhost:3306/crm
spring.datasource.username = root
spring.datasource.password = mymysql
spring.datasource.driverClassName = com.mysql.jdbc.Driver
vs
application.yml语法
server:
port: 80
session-timeout: 30
tomcat.uri-encoding: UTF-8
spring:
datasource:
url : jdbc:mysql://localhost:3306/crm
username : root
password : mymysql
driverClassName : com.mysql.jdbc.Driver
application.properties优先级
一个项目中可以有多个application.properties文件存放在不同目录中,此时他们会遵循固定的优先级来处理有冲突的属性配置, 优先级由高到底,高优先级的配置会覆盖低优先级的配置
项目/config/application.properties
项目/application.properties
classpath:config/application.properties1
classpath:application.properties2
一般都在classpath:application.properties做配置,其他方式不使用
参数属性绑定
准备工作
#application.properties
jdbc.username=root
jdbc.password=admin
@Value绑定单个属性
@Controller
public class HelloController {
@Value("${jdbc.username}")
private String username;
@RequestMapping("/hello")
@ResponseBody
public Object hello(){
return "hello, springboot~" + username;
}
}
直接访问/hello观察username值
也可以在自定义的类上绑定, 注意前提是这个类必须交给spring容器管理
@Component
@ToString
@Setter
@Getter
public class MyData {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
}
注入MyDataSource 测试value是否能取值
@Autowired
private MyData myData;
@RequestMapping("/value")
@ResponseBody
public Object value(){
return myData;
}
@ConfigurationProperties批量绑定属性
若觉得上面的方式比较笨重, 可以把前缀抽取到@ConfigurationProperties中, 并且设置类属性与需要绑定的参数名相同, 可实现自动绑定 ,
自定义类
@Component
@ToString
@Setter
@Getter
@ConfigurationProperties("jdbc") //相当于 @ConfigurationProperties(prefix="jdbc")
public class MyData {
private String username;
private String password;
}
或者
@Bean
@ConfigurationProperties("jdbc")
public MyData myData() {
return new MyData();
}