回顾 spring
优点
开源,轻量级,非侵入式的一站式框架,简化企业级应用开发。
控制反转(IOC),依赖注入(DI)降低了组件之间的耦合性,实现了软件各层之间的解耦。
面向切面(AOP),利用它可以很容易实现一些拦截,如事务控制等。
spring 对于主流的应用框架提供了很好的支持,例如 mybatis。
spring 提供有自己的 mvc 实现。
缺点
虽然 spring 的组件代码是轻量级的,但它的配置却是重量级的。虽然 spring引入了注解功能,但是仍然需要编写大量的模板化配置文件.
项目的依赖管理也是一件耗时耗力的事情,在环境搭建时,需要分析要导入大量库的坐标,而且还需要分析导入与之有依赖关,一旦选错依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。
Spring Boot 对上述 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 你只需要“run”就可以非常轻易的构建独立的、企业级别的spring 应用。
我们为 spring 平台和第三方依赖库提供了一种固定化的使用方式,使你能非常轻松的开始开发你的应用程序。大部分 SpringBoot 应用只需要很少的配置。
优点:
轻量级的,非侵入式的,IOC,AOP的一站式框架
目的是简化企业级应用开发
IOC 管理项目中的对象
AOP 动态功能增强(事务管理)
JDBC 数据访问层封装
springWEB web层进行了封装
缺点:
1.配置非常麻烦,且配置模板化(都一样的)
2.需要开发人员添加许多的依赖,且依赖之间的版本不好控制
SpringBoot对以上spring的两个缺点进行补充,主要是对spring框架的搭建进行封装简化.
不是说就不需要配置了,只是换了一种方式进行配置,并把许多模板化配置直接整合了.
springBoot是基于spring框架,对spring框架的搭建进行封装不是代替spring,spring的核心功能不变的. 可以快速搭建,并集成其他的框架和组件.
springBoot 特点
创建独立的 spring 应用程序;
直接内嵌 tomcat(一个项目就是一个服务,就是微服务的思想)、jetty 和 undertow;
提供了固定化的“starter”配置,以简化构建配置尽可能的自动配置 spring 和第三方库;
提供产品级的功能,如:安全指标、运行状况监测和外部化配置等绝对不会生成代码;
绝对不会生成代码,并且不需要 XML 配置;
springBoot 的核心功能
起步依赖
起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
自动配置
Spring Boot 的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring 配置应该用哪个,不该用哪个。该过程是 Spring 自动完成的。
springBoot 注解
springboot 实现自动装配的核心仍然是使用注解标签,
@SpringBootApplication 是 springboot 核心注解,其中包含
@SpringBootConfiguration,@EnableAutoConfiguration,
@ComponentScan.
@Configuration
加入@Configuration 注解,表明这就是一个配置类。有一个 myBean()的方法,并用@Bean 进行注释,返回一个 MyBean()的实例,表明这个方法是需要被Spring 进行管理的 bean。@Bean 如果不指定名称的话,默认使用 myBean名称,也就是小写的名称。
@Bean
相当于 XML 中的<bean></bean>,放在方法的上面,而不是类,意思是产生一个 bean,并交给 spring 管理。
SpringBoot 开发环境构建
官网配置生成
选择配选项,在线生成并下载
解压后修改 pom.xml 版本为 2.6.6,删除.mvn 文件夹,mvnw.cmd 文件
导入到 idea 中
Springboot 集成 web 组件后,内置了 tomcat 服务器,一个 springboot 应用相当于一个独立的服务,可以使用启动类中的 main 方法启动 springboot 程序。
在线生成启动 logo: https://www.bootschool.net/ascii
下载存放在 resources 目录下即可.
spring Boot 配置文件
Spring Boot 使用一个全局的配置文件(配置文件名是固定的)
application.properties 属性文件格式,内容为键值对
server.port=8080
application.yml
yml 是 YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心.
yml 配置示例
server:
port: 8080
yaml 基本语法:
语法结构:key:空格 value
以此来表示一对键值对(空格不能省略);以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
值的写法
字面量:普通的值[数字,布尔值,字符串]
K: V
字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;
案例:
user:
name: zhangsan
age: 20
使用@Value 注解标签将配置文件中的内容映射到类中的属性.
@Value("${user.name}")
springBoot 集成 JDBC
数据源配置
在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式。
首先,为了连接数据库需要引入 jdbc 支持,在 pom.xml 中引入如下配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
在 application.yml 中配置数据源信息
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/ssm_db?serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
使用 JdbcTemplate 操作数据库
Spring 的 JdbcTemplate 是自动配置的,你可以直接使用@Autowired 来注入到你自己的 bean 中来使用。
springBoot 整合阿里数据源
导入阿里数据源 jar
在 yml 文件中注册阿里数据库连接池
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5 初始化时建立物理连接的个数
minIdle: 1 最小连接池数量
maxActive: 20 最大连接池数量
添加 DruidDataSource 配置工具类
springBoot 集成 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("接口所在的包地址")或者在接口上添加@Mapper。
springBoot 集成日志功能
日志是软件应用必备的组件,是程序 debug,或是数据收集管理的重要依据,方便我们监测生产环境的变量值变化以及代码运行轨迹。主要是为了方便我们监测生产环境的变量值变化以及代码运行轨迹等。这些记录会被输出到我们指定的位置形成文件,帮助我们分析错误以及用户请求轨迹。
日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源,尤其是在生产环境中运行的程序更加重要。
常用日志组件
slf4j(Simple Logging Facade for Java)
commons-logging
Log4J
Log4J2
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
@Aspect
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(getClass());
//通配符,定义规则,哪些方法可以被我的切面切到,这里的意思是不限返回值和方法和参数
@Pointcut("execution(public * com.ffyc.news.controller..*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("HTTP_METHOD :{} ", request.getMethod());
logger.info("IP : {}", request.getRemoteAddr());
//获取所有请求参数
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfter(Object ret) throws Throwable {
// 处理完请求,返回内容
logger.info("RESPONSE : " + ret);
}
}
springBoot 统一异常处理
日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用 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;
}
}
springBoot 集成 Swagger
支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。
搭建
1.导入 jar
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2. 在 application.yml 中配置
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
3. 添加 swagger 配置类
配置 swagger 扫描方式
及放行静态资源请求不被 spring 拦截
Swagger 使用的注解及其说明
@Api:用在类上,说明该类的作用,tags 类的功能进行描述.
@Api(tags="用户登录控制器")
@ApiOperation:用在方法上,用于对方法功能说明。
@ApiOperation(value="方法概述", notes="功能详细描述")@ApiImplicitParam:用来注解来给方法入参增加说明。
paramType 属性表示参数放在哪里,主要有以下几个属性:
header-->放在请求头。请求参数的获取:@RequestHeader(代码中接收注解)
query-->用于 get 请求的参数拼接。请求参数的获取
path(用于 restful 接口)-->请求参数的获取:@PathVariable(代码中接收注解)
body-->放在请求体。请求参数的获取:@RequestBody(代码中接收注解)参数为实体类
在实体类上添加注解
@ApiModel:描述一个 Model 的信息(参数为实体类时使用)
@ApiModelProperty:描述一个 model 的属性@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses 中,一般用于表达一个错误的响应信息
code:数字,例如 400
message:信息,例如"请求参数没填好"
也可以不需要添加
Swagger UI 的使用
访问 swagger-ui.html 后可以在页面中看到所有需要生成接口文档的控制器名称。
http://localhost:端口/swagger-ui.html
springBoot 定时任务
项目中经常需要在一些固定的时间节点上,让程序自动去执行某些操作,这时就需要用到定时器.
实现方式 1: 使用 java 自带的 TimerTask,Timer
方式 2:使用 spring 框架中提供的定时任务
开启定时任务
在 SpringBoot 的启动类上声明 @EnableScheduling:
@EnableScheduling
添加定时任务
只需使用@Scheduled 注解标注即可,Spring Boot 启动后会自动加载并执行定时任务,无需手动操作.
Cron 表达式
Spring Task 的实现需要使用 cron 表达式来声明执行的频率和规则,cron 表达式是由 6 位或者 7 位组成的(最后一位可以省略),每位之间以空格分隔,每位从左到右代表的含义如下:
其中*和?号都表示匹配所有的时间