1. 简介
繁琐的配置,整合第三方框架的配置问题,导致了开发和部署效率的降低
SpringBoot是和Spring框架紧密结合用于提升Spring开发者体验的工具
SpringBoot集成了大量常用的第三方库配置,这些第三方库几乎可以是零配置的开箱即用,大部分的SpringBoot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑
2. 优点
- 基于Spring4
- 简化编码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
替代了
<!-- .....省略其他依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.7.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.7.RELEASE</version>
<scope>compile</scope>
</dependency>
- 简化监控
- 简化配置:使用注解’
@Configuration表示该类是个配置类
@bean表示该方法返回一个Bean - 简化部署
生成jar包,使用java -jar xxx.jar一键式启动项目
PS:阿里镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3. SpringBoot返回Json数据及数据封装
使用@RestController注解返回Json格式的数据
@RestController注解包含:@Controller和ResponseBody注解
SpringBoot默认使用的Json解析技术框架是 Jackson
4.SpringBoot 使用slf4j进行日志记录
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
4.1application.yml中对日志的配置
application.yml 文件是 Spring Boot 中唯一一个需要配置的文件
yml 文件的层次感特别好、更直观、对格式要求比较高
application.yml对日志的配置
logging:
config: logback.xml
level:
com.itcodai.course03.dao: INFO
logging.config:指定项目启动读取的配置文件
logging.level:指定具体的mapper中日志的输出级别
常用的日志级别按照从高到低依次为:ERROR、WARN、INFO、DEBUG。
**logback.xml配置文件:**可以定义日志输出的格式、路径、、控制台输出格式、文件大小、保存时长等
<!--定义日志输出格式和存储路径-->
<configuration>
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<property name="FILE_PATH" value="D:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />
</configuration>
<!--
%date表示日期
%thread表示线程名
%-5level表示级别从左显示5个字符宽带
%logger{36}表示logger名字最长36字符
%msg表示日志消息
%n换行符
“FILE_PATH”文件路径,value指具体位置
%i表示第i个文件
日志存储的路径必须要是绝对路径。
-->
<!--定义控制台输出-->
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>
<!--
使用 <appender> 节点设置个控制台输出(class="ch.qos.logback.core.ConsoleAppender")的配置,定义为 “CONSOLE”。
使用上面定义好的输出格式(LOG_PATTERN)来输出,使用 ${} 引用进来即可。
-->
<!--定义日志文件的相关参数-->
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按照上面配置的FILE_PATH路径来保存日志 -->
<fileNamePattern>${FILE_PATH}</fileNamePattern>
<!-- 日志保存15天 -->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>
<!--
使用 <appender> 定义一个名为 “FILE” 的文件配置
配置日志文件保存的时间、单个日志文件存储的大小、以及文件保存的路径和日志的输出格式。
-->
<!--定义日志输出级别-->
<configuration>
<logger name="com.itcodai.course03" level="INFO" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
<!--
使用 <logger> 定义项目中默认的日志输出级别
使用 <root> 引用上面定义好的控制台日志输出和日志文件的参数
-->
4.2 使用logger在项目中打印日志
@RestController
@RequestMapping("/test")
public class TestController {
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/log")
public String testLog() {
logger.debug("=====测试日志debug级别打印====");
logger.info("======测试日志info级别打印=====");
logger.error("=====测试日志error级别打印====");
logger.warn("======测试日志warn级别打印=====");
// 可以使用占位符打印出一些参数信息
String str1 = "blog.itcodai.com";
String str2 = "blog.csdn.net/eson_15";
logger.info("======倪升武的个人博客:{};倪升武的CSDN博客:{}", str1, str2);
return "success";
}
}
5. SpringBoot中的项目属性配置
5.1 少量配置信息的情形
假设订单服务的端口号是8002,做如下配置
server:
port: 8001
# 配置微服务的地址
url:
# 订单微服务的地址
orderUrl: http://localhost:8002
使用 @Value 来配置订单服务地址
在属性上使用 @Value注解 即可获取到配置文件中的配置信息
@RestController
@RequestMapping("/test")
public class ConfigController {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigController.class);
@Value("${url.orderUrl}")
private String orderUrl;
@RequestMapping("/config")
public String testConfig() {
LOGGER.info("=====获取的订单服务地址为:{}", orderUrl);
return "success";
}
}
@Value注解通过 ${key} 即可获取配置文件中和key对应的value值。
5.2 多个配置信息的情形
# 配置多个微服务的地址
url:
# 订单微服务的地址
orderUrl: http://localhost:8002
# 用户微服务的地址
userUrl: http://localhost:8003
# 购物车微服务的地址
shoppingUrl: http://localhost:8004
对于这种情况,我们可以先定义一个 MicroServiceUrl 类来专门保存微服务的 url,
@Component
@ConfigurationProperties(prefix = "url")
public class MicroServiceUrl {
private String orderUrl;
private String userUrl;
private String shoppingUrl;
// 省去get和set方法
}
使用 @ConfigurationProperties 注解 并且使用 prefix 来指定一个前缀
前缀名 + 属性名就是配置文件中定义的 key
同时,该类上面需要加上 @Component 注解,把该类作为组件放到Spring容器中,让 Spring 去管理,我们使用的时候直接注入即可
@ConfigurationProperties 注解需要导入他的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
不需要在代码中一个个引入这些微服务的 url 了,直接通过 @Resource 注解将刚刚写好配置类注入进来
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);
@Resource
private MicroServiceUrl microServiceUrl;
@RequestMapping("/config")
public String testConfig() {
LOGGER.info("=====获取的订单服务地址为:{}", microServiceUrl.getOrderUrl());
LOGGER.info("=====获取的用户服务地址为:{}", microServiceUrl.getUserUrl());
LOGGER.info("=====获取的购物车服务地址为:{}", microServiceUrl.getShoppingUrl());
return "success";
}
}
5.3 指定项目配置文件
实际项目中,一般有两个环境:开发环境和生产环境。
新建两个配置文件: application-dev.yml 和 application-pro.yml,分别用来对开发环境和生产环境进行相关配置
# 开发环境配置文件
server:
port: 8001
# 开发环境配置文件
server:
port: 8002
然后在 application.yml 文件中指定读取哪个配置文件即可
spring:
profiles:
active:
- dev
这样就可以在开发的时候,指定读取 application-dev.yml 文件,访问的时候使用 8001 端口,部署到服务器后,只需要将 application.yml 中指定的文件改成 application-pro.yml 即可,然后使用 8002 端口访问,非常方便
6. SpringBoot中的MVC支持
Spring Boot 的 MVC 支持主要来介绍实际项目中最常用的几个注解
6.1@RestController
@RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解,使用 @RestController 之后就不用再使用 @Controller 了。但是需要注意一个问题:如果是前后端分离,不用模板渲染的话,比如 Thymeleaf,这种情况下是可以直接使用 @RestController 将数据以 json 格式传给前端,前端拿到之后解析;但如果不是前后端分离,需要使用模板来渲染的话,一般 Controller 中都会返回到具体的页面,那么此时就不能使用 @RestController。
6.2 @RequestMapping
@RequestMapping 是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。
该注解有6个属性,一般在项目中比较常用的有三个属性:value、method 和 produces
**value:**指定请求的实际地址,value 可以省略不写
**method:**指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET
**produces:**指定返回内容类型,如 produces = “application/json; charset=UTF-8”
6.3 @PathVariable
@PathVariable注解主要是用来获取 url 参数
@GetMapping("/user/{id}")
public String testPathVariable(@PathVariable Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
ps: 要 url 中占位符中的 id 值直接赋值到参数 id 中,需要保证 url 中的参数和方法接收参数一致,否则就无法接收
如果不一致,需要用 @PathVariable 中的 value 属性来指定对应关系
@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
6.4 @RequestParam
@RequestParam 注解:获取请求参数的
与 @PathValiable注解的区别:
@PathValiable 是从 url 模板中获取参数值,即:http://localhost:8080/user/{id}
@RequestParam是从 request 里面获取参数值,即:http://localhost:8080/user?id=1
除value属性外,required属性和defaultValue属性比较常用
required 属性: true 表示该参数必须要传,否则就会报 404 错误,false 表示可有可无。
defaultValue 属性: 默认值,表示如果请求中没有同名参数时的默认值。
6.5 @RequestBody
@RequestBody 注解 用于接收前端传来的实体,接收参数也是对应的实体
@RequestBody 注解 用于 POST 请求上,接收 json 实体参数
在传递的参数比较多的情况下,使用 @RequestBody 接收会非常方便
//1.封装一个实体来接收参数
public class User {
private String username;
private String password;
// set get
}
@PostMapping("/user")
public String testRequestBody(@RequestBody User user) {
System.out.println("获取到的username为:" + user.getUsername());
System.out.println("获取到的password为:" + user.getPassword());
return "success";
}