目录
- SpringBoot简介
- 项目搭建
- 热部署
- 静态资源路径
- 配置多种运行环境
- 设置全局异常处理
- 设置日志logback+slf4j
- yml文件的使用
- 自定义配置项(在项目中使用配置文件中的值)
- 项目打包
SpringBoot简介
springboot用于快速搭建spring项目
- 使用起步依赖,十分方便
- 提供了大量默认配置,开箱即用
- 可搭建分布式项目
项目搭建
一般都是web项目,创建时勾选Spring Web。
默认使用最新稳定版的springboot,可以选择版本,如果没有符合的版本,创建项目后到pom.xml改。
常见配置
#开启调试模式,控制台会打印更多的信息,默认false
debug=true
# 项目名称
spring.application.name=xm-mall
# 使用的端口,缺省时默认为8080
server.port=8000
不管配不配置项目名,访问路径都是 host:port/ ,不是 host:port/appName
热部署
1、Settings中勾选
2、创建项目时勾选
也可以自己添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
初次设置后,以后每次新建项目时,只需弄这一步。
3、Ctrl+Shift+Alt+/ ,勾选项目运行时自动编译
使用热部署,修改代码后不需要重新运行应用,但热部署有点占资源,配置低的电脑斟酌使用。
静态资源路径
springboot默认的静态资源目录
- classpath:/static
- classpath:/public
- classpath:/resources
- classpath:/META-INF/resources
一般使用/resources,在/resources/static下新建文件夹css、js、image来存放相关资源。
配置多种运行环境
1、在resources下新建3个配置文件,分别写开发、测试、生产环境的配置
- application-dev.properties #开发
- application-test.properties #测试
- application-prod.properties #生产
2、在自带的application.properties中指定要使用的配置
# 值是-后面的部分,dev、test、prod
spring.profiles.active=dev
application.properties是公共的,开发、测试、生产环境都会加载使用,可以把公共配置写在application.properties中。
执行jar包时也可以指定要使用的配置
java -jar xxx.jar --spring.profiles.active=dev
设置全局异常处理
全局异常处理用于统一处理没被捕获、处理的异常,在异常被抛到JVM之前捕获、处理。异常可以是java预定义的异常,也可以是自定义的异常。
新建包exception,包下新建类GlobalExceptionHandler
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) //指定要捕获、处理哪种异常,Exception.class即处理所有种类的异常
@ResponseBody //可以以json形式返回给浏览器直接显示出来,也可以专门写一个error页面,调用该页面显示错误信息
public Map<String,String> handler(Exception e){ //如果要使用异常对象,可以写成参数,会自动传入
Map<String, String> map = new HashMap<>(2);
map.put("tip", "系统发生错误!请联系管理员xxxxxx@xxx.com");
map.put("errorInfo", e.getMessage());
return map;
}
}
上面的处理方式太笼统,常见的做法是在exception包下写一些自定义的异常类,在项目中可以自己抛出异常
throw new XxxException();
针对不同类型的异常写专门的处理
@ControllerAdvice
public class GlobalExceptionHandler {
// 捕获、处理AxxException
@ExceptionHandler(AxxException.class)
@ResponseBody
public Map<String,String> handler(AxxException e){
Map<String, String> map = new HashMap<>(3);
map.put("tip", "系统发生错误!请联系管理员xxxxxx@xxx.com");
map.put("errorCode", "01");
map.put("errorInfo", e.getMessage());
return map;
}
// 捕获、处理BxxException
@ExceptionHandler(BxxException.class)
@ResponseBody
public Map<String,String> handler(BxxException e){
Map<String, String> map = new HashMap<>(3);
map.put("tip", "系统发生错误!请联系管理员xxxxxx@xxx.com");
map.put("errorCode", "02");
map.put("errorInfo", e.getMessage());
return map;
}
//.....
}
设置日志logback+slf4j
日志的作用
- 便于分析程序执行过程
- 方便调试
- 可以将业务数据存储到文件、数据库,便于后期分析
常见的日志组件:log4j、logback、slf4j、commons-logging。
日志框架的选择对性能有一定影响,尤其是需要大量使用日志的项目。springboot2.x默认使用logback,logback是在log4j的基础上改进而来的,单独使用logback只能记录日志,还需使用其它日志框架在项目中log自定义的信息,推荐搭配slf4j。
logback的日志级别:DEBUG < INFO(默认) < WARN < ERROR
默认格式:日期时间 日志级别 pid 线程名(main是主线程) 哪个类输出的日志(包名.类名) 信息
2020-05-24 16:51:38.323 INFO 25168 --- [ main] com.chy.visit.VisitApplication : No active profile set, falling back to default profiles: default
pid即进程号,唯一标识一个进程,比如上面运行的项目的pid是25168
logback常用配置
#日志文件的保存路径
logging.file.path=classpath:/
#logging.file.path=/var/mall/log
#文件名
logging.file.name=mall.text
#logging.file.name=mall.log
#日志级别,默认info,设置为debug也可以通过debug=true来设置,上线设置为warn
#logging.level.root=info
#单个文件的最大尺寸,默认10M
#logging.file.max-size=10MB
#日志最多保留几天,默认7
#logging.file.max-history=7
如果日志配置很详细、配置项很多,可以在resources下新建 logback-spring.xml 来单独写。
在项目中使用slf4j输出日志,有2种方式
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Xxx {
// 方式一 通过LoggerFactory获取Logger对象
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public void xxx(){
//....
logger.debug("debug msg");
logger.info("info msg");
logger.warn("warn msg");
logger.error("error msg");
//.....
}
}
import lombok.extern.slf4j.Slf4j;
@Slf4j //方式二 通过lombok的 @Slf4j 注解自动创建Logger对象,对象名是log
public class Xxx {
public void xxx(){
//....
log.debug("debug msg");
log.info("info msg");
log.warn("warn msg");
log.error("error msg");
//.....
}
}
yml文件的使用
SpringBoot默认会加载resources下的配置文件
- application*.yml
- application*.yaml
- application*.properties
yml、yaml是同一种文件,后缀写成yml、yaml都可以。
yml语法
# key后面加1个空格,key、value都不引
# 普通字段
name: chy
# 对象
user:
name: chy
age: 20
# 对象嵌套对象
student:
name: chy
age: 20
teacher:
name: xxx
age: 40
# 数组
city: [beijing,shanghai,guangzhou,shenzhen]
# 数组嵌套对象
studentArr: [{name: zhangsan,age: 20},{name: lisi,age: 20}]
自定义配置项(在项目中使用配置文件中的值)
eg. 在springboot的配置文件中指定上传文件的保存位置
从配置文件中取值有2种方式(properties、yml都适用)
1、使用@Value("${xxx}")注入基本类型、String,注意${ }要引起来
@Component
public class Config {
@Value("${id}") //注入普通字段
private static int id;
@Value("${upload.save-location}") //注入对象的属性值
private static String saveLocation; //$Value()注入对象的属性值有个好处:key不必相同
@Value("${city[0]}") //注入数组元素
private static String city;
//.....
}
@Value()只能注入基本数据类型、String类型的值,不能注入引用类型,比如整个数组、对象(但可以一项一项地注入)
2、使用@ConfigurationProperties(prefix = “xxx”)注入对象
@Setter //需要提供setter方法注入
@Getter
@ConfigurationProperties(prefix = "upload") //指定配置项前缀
@Component
public class UploadConfig {
private static int maxFileSize; //会自动注入同名的属性值
private static String savaLocation;
//.....
}
说明
1、 @Value只能标注在成员变量及其setter方法上,@ConfigurationProperties只能标注在类上。lombok的@Getter、@Setter只会生成实例成员的方法,不能生成静态成员的方法;@Value也只能注入到类的实例成员上,不能注入到静态成员上。
2、可以注入到配置类,然后在其它类中引用配置类,需要用@Component把配置类放到spring容器中;也可以不使用配置类,直接注入到要使用地方,比如直接把upload.saveLocation注入到处理上传文件的类的成员变量中。
3、如果要使用@ConfigurationProperties,在创建项目时可以勾选
也可以手动添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
先使用@ConfigurationProperties,这样在yml中写配置时会提示对应的字段。
项目打包
springboot项目可以打包为war、jar,创建项目时可选
因为有引导类(主类),打包为jar也可以运行,默认打包为jar。
mvn clean package #先清理再打包
java -jar xxx.jar #运行jar包