回顾Spring
Spring Boot概述
Spring Boot 是由 Pivotal 团队提供的在 spring 框架基础之上开发的框架,
其设计目的是用来简化应用的初始搭建以及开发过程。
Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具.
Spring Boot 以约定大于配置的核心思想,从而使开发人员不再需要定义样板化的配置。它集成了大量常用的第三方库配置(例如 Redis,Jpa RabbitMQ,Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用,通过这种方式,Spring Boot 致力于在蓬勃发展的快速应用开发领域成为领导者。
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.
Spring Boot 你只需要“run”就可以非常轻易的构建独立的、企业级别的spring 应用。
我们为 spring 平台和第三方依赖库提供了一种固定化的使用方式,使你能非常轻松的开始开发你的应用程序。大部分 SpringBoot 应用只需要很少的配置。
Spring Boot特点
创建独立的 spring 应用程序
直接内嵌 tomcat、jetty 和 undertow
提供了固定化的“starter”配置,以简化构建配置
尽可能的自动配置 spring 和第三方库
提供产品级的功能,如:安全指标、运行状况监测和外部化配置等
绝对不会生成代码,并且不需要 XML 配置
Spring Boot的核心功能
起步依赖
起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
自动配置
Spring Boot 的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring 配置应该用哪个,不该用哪个。该过程是 Spring 自动完成的。
Spring Boot开发环境构建
创建一个普通的maven项目
在pom.xml文件下添加以下依赖
<!--依赖的父级工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/>
</parent>
<!--指定 jdk 版本-->
<properties>
<java.version>1.8</java.version>
</properties>
<!--添加基本的 springweb 依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.6</version>
</plugin>
</plugins>
</build>
创建基本包目录,在包下创建一个启动类,如下所示:
@SpringBootApplication
public class NewsApplication {public static void main(String[] args) {SpringApplication.run(NewsApplication.class);
}
}
Springboot 集成 web 组件后,内置了 tomcat 服务器,一个 springboot 应用相当于一个独立的服务,可以使用启动类中的 main 方法启动 springboot 程序.
在线生成启动logo:
https://www.bootschool.net/ascii-art
下载存放在 resources 目录下即可.
Spring Boot配置文件
Spring Boot 使用一个全局的配置文件( 配置文件名是固定的 , 必须为application),用来存储项目中需要用到的各种配置参数.
配置文件格式有两种,一种为 properties 格式,一种 yaml 格式.
application.properties 属性文件格式,内容为键值对
server.port=8080
properties 格式比较简单,没有什么难度,在此我们以第二种 yaml 格式为例.
application.yml
yml 是 YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心.
yml 配置示例
server:
port: 8080
yaml 基本语法:
语法结构:key:空格 value;
以此来表示一对键值对(空格不能省略);
以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的;
字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;
以#作为注释符号.
案例:
user:
name: zhangsan
age: 20
使用@Value 注解标签将配置文件中的内容映射到类中的属性.
@Value("${user.name}")
Spring Boot数据访问管理
数据源配置
首先,为了连接数据库需要引入JDBC支持,在pom.xml中引入如下配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
记得添加mysql驱动依赖
在 application.yml 中配置数据源信息
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
Spring Boot整合阿里数据源
导入阿里数据源jar
在yml文件中注册阿里数据库连接池
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5 初始化时建立物理连接的个数
maxActive: 20 最大连接池数量
Spring Boot注解
springboot 实现自动装配的核心仍然是使用注解标签,
@SpringBootApplication 是 springboot核心注解,其中包含@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan.
@Configuration
加入@Configuration 注解,表明这就是一个配置类。有一个 myBean()的方法并用@Bean 进行注释,返回一个 MyBean()的实例,表明这个方法是需要被Spring 进行管理的 bean。@Bean 如果不指定名称的话,默认使用 myBean名称,也就是小写的名称。
@Bean
相当于 XML 中的<bean></bean>,放在方法的上面,而不是类,意思是产生一个 bean,并交给 spring 管理。
SpringBoot 集成 mybatis
Spring Boot集成mybatis
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
在 application.yml 中配置数据源信息
mybatis:
type-aliases-package: com.ff.cms.bean
mapper-locations: classpath:mapper/*Mapper.xml
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
启动类上添加@MapperScan("接口所在的包地址")@MapperScan("接口所在的包地址")
Spring Boot集成日志功能
日志是软件应用必备的组件,是程序 debug,或是数据收集管理的重要依据,方便我们监测生产环境的变量值变化以及代码运行轨迹。
主要是为了方便我们监测生产环境的变量值变化以及代码运行轨迹等。这些记录会被输出到我们指定的位置形成文件,帮助我们分析错误以及用户请求轨迹。
日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源,尤其是在生产环境中运行的程序更加重要。
常用日志组件
slf4j(Simple Logging Facade for Java)
commons-logging
Log4JLog4J2
Logback
JUL(Java Utils Logging)
springboot 中对这些组件都提供了支持,slf4j 和 commons-logging 是日志的门面接口,它们都不是具体的日志框架,你可以指定其他主流的日志实现框架。一般首选强烈推荐使用 slf4j + logback.
日志的级别划分:从低到高:debug<info<warn<error
配置日志级别和日志文件位置
logging:
level:
com.ffyc.news: debug
file:
name: E:/log/log.log
其余信息在 logback 配置文件中在类中使用
创建 Logger 对象
private static Logger logger = LoggerFactory.getLogger(当前类名.class);
在需要的位置调用具体的日志级别方法输出
logger.debug("user account:{},user password:{}", user.getAccount(),user.getPassword());
logger.info("user account:{},user password:{}", user.getAccount(),user.getPassword());
logger.warn("user account:{},user password:{}", user.getAccount(),user.getPassword());
logger.error("user account:{},user password:{}", user.getAccount(),user.getPassword());
SpringBoot使用AOP统一打印日志
导入依赖jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
定义切面通知类
@Component@Aspectpublic class LogAspect {private Logger logger = LoggerFactory.getLogger(LogAspect.class);@Before("execution(public * com.ffyc.news.web..*.*(..))")public void savelog(JoinPoint joinPoint) {ServletRequestAttributes attributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();//Object[] objs =joinPoint.getArgs();获取方法参数// 记录下请求内容logger.info("HTTP_METHOD :{} ", request.getMethod());logger.info("IP : {}", request.getRemoteAddr());//客户端 ip}}
Spring Boot统一异常处理
日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用 try ,catch 的方式处理异常或者 throw,throws 的方式抛出异常不管。这种方法对于程序员来说处理也比较麻烦,所以我们希望既能方便程序员编写代码,不用过多的自己去处理各种异常编写重复的代码又能提升用户的体验,这时候全局异常处理就显得很重要也很便捷了,是一种不错的选择。
全局异常捕获与处理
Springboot 对于异常的处理也做了不错的支持 ,它提供了一个@RestControllerAdvice 注解以及 @ExceptionHandler 注解,前者是用来开启全局的异常捕获,后者则是说明捕获哪些异常,对那些异常进行处理。
@RestControllerAdvice
public class GlobalExceptionHandler {/*** 异常处理*/@ExceptionHandler(Exception.class)public CommonResult globalException(Exception e) {CommonResult commonResult = new CommonResult(500, e.getMessage());return commonResult;}
}
Spring Boot集成Swagger
支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。
提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。
本次使用 knife4j 实现接口文档生成.
knife4j 前身是 swagger-bootstrap-ui, 取名 knife4j 是希望它能像一把匕首一样小巧,轻量,并且功能强悍!
搭建使用
导入jar
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
Swagger使用的注解及其说明
@Api:用在类上,说明该类的作用,tags 类的功能进行描述.
@Api(tags="用户登录控制器")
@ApiOperation:用在方法上,用于对方法功能说明。
@ApiOperation(value="方法概述")
@ApiImplicitParam:用来注解来给方法入参增加说明。
在实体类上添加注解
@ApiModel:描述一个 Model 的信息(参数为实体类时使用)
@ApiModelProperty:描述一个 model 的属性
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses 中,一般用于表达响应信息
文档访问地址:http://ip:端口/doc.html
Spring Boot定时任务
项目中经常需要在一些固定的时间节点上,让程序自动去执行某些操作,这时就需要用到定时器.
实现方式 1: 使用 java 自带的 TimerTask,Timer
public static void main(String[] args) {
// 定义一个任务TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.println("打印当前时间:" + new Date());}};
// 计时器Timer timer = new Timer();
// 开始执行任务 (延迟 1000 毫秒执行,每 3000 毫秒执行一次)timer.schedule(timerTask, 1000, 3000);
}
方式 2:使用 spring框架中提供的定时任务
开启动时任务
在SpringBoot的启动类上声明@EnableScheduling
添加定时任务
只需使用@Scheduled 注解标注即可,Spring Boot 启动后会自动加载并执行定时任务,无需手动操作.
@Component
public class TestTask {@Scheduled(cron = "*/6 * * * * ?")private void process() {System.out.println("现在时间:" + new Date());}
}
Cron表达式
Spring Task 的实现需要使用 cron 表达式来声明执行的频率和规则,cron 表达式是由 6 位或者 7 位组成的(最后一位可以省略),每位之间以空格分隔,每位从左到右代表的含义如下:
其中 * 和 ? 号都表示匹配所有的时间
参考资料: https://cron.qqe2.com